官术网_书友最值得收藏!

  • 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”看看吧。結果雖然還是黑屏,但程序運行肯定是正常的。太好了,這就放心了。大家明天見!

主站蜘蛛池模板: 无锡市| 浑源县| 五台县| 称多县| 朝阳县| 都江堰市| 德昌县| 米脂县| 珲春市| 彰化县| 岳普湖县| 营口市| 新河县| 红原县| 鄱阳县| 稻城县| 东乌| 万载县| 莱西市| 攀枝花市| 济源市| 宝鸡市| 陇南市| 阿坝县| 论坛| 襄城县| 龙陵县| 葫芦岛市| 姜堰市| 龙江县| 平湖市| 翁牛特旗| 襄城县| 涟源市| 漠河县| 封开县| 朝阳市| 依兰县| 岳普湖县| 瑞金市| 杨浦区|