書名: 30天自制操作系統作者名: (日)川合秀實本章字數: 647字更新時間: 2020-03-11 14:01:45
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”看看吧。結果雖然還是黑屏,但程序運行肯定是正常的。太好了,這就放心了。大家明天見!