30天自制操作系统
上QQ阅读APP看书,第一时间看更新

10 实现HLT(harib00j)

虽然夜已经深了,但笔者现在还不能说“今天就到此结束”。不让计算机处于HALT(HLT)状态心里就不舒服。我们做出的程序这么耗电,不把这个问题解决掉怎么能睡得着呢(笑)。我们来努力尝试一下吧。

首先写了下面这个程序,naskfunc.nas。

naskfunc.nas

也就是说,是用汇编语言写了一个函数。函数名叫io_hlt。虽然只叫hlt也行,但在CPU的指令之中,HLT指令也属于I/O指令,所以就起了这么一个名字。顺便说一句,MOV属于转送指令,ADD属于演算指令。

用汇编写的函数,之后还要与bootpack.obj链接,所以也需要编译成目标文件。因此将输出格式设定为WCOFF模式。另外,还要设定成32位机器语言模式。

在nask目标文件的模式下,必须设定文件名信息,然后再写明下面程序的函数名。注意要在函数名的前面加上“_”,否则就不能很好地与C语言函数链接。需要链接的函数名,都要用GLOBAL指令声明。

下面写一个实际的函数。写起来很简单,先写一个与用GLOBAL声明的函数名相同的标号(label),从此处开始写代码就可以了。这次新出现的RET指令,相当于C语言的return,意思就是“函数的处理到此结束,返回吧”,简洁明了。

在C语言里使用这个函数的方法非常简单。我们来看看bootpack.c。

本次的bootpack.c

/*告诉C编译器,有一个函数在别的文件里*/

void io_hlt(void);

/*是函数声明却不用{ },而用;,这表示的意思是:函数是在别的文件中,你自己找一下吧!*/

void HariMain(void)
{

fin:
    io_hlt(); /*执行naskfunc.nas里的_io_hlt*/
    goto fin;

}

源程序里的注释写得很到位,请仔细阅读一下。

好了,源程序增加了,Makefile也进行了添加,那么赶紧运行“make run”看看吧。结果虽然还是黑屏,但程序运行肯定是正常的。太好了,这就放心了。大家明天见!