5-寄存器與BIOS中斷

在計算機系統中,數據存儲採用三級存儲架構——寄存器,內存和硬盤。寄存器在CPU的芯片內,其訪問速度和CPU的計算速度差不多,但成本比較高,而且CPU的體積也決定了寄存器不可能有較大的容量。在編寫focus系統的啓動代碼部分,因爲要使用彙編語言,因此,就需要直接操作寄存器。那麼我們就先了解下CPU內部的一些寄存器。

這裏andrew感到很抱歉,因爲沒有辦法深入的去介紹細節性的東西了,如果andrew要將focus編寫過程中所有的細節都詳細的介紹,那麼andrew光寫文章都要寫幾個月,這個有點不太現實,所以andrew想了想,遇到一些知識點,如果這些點大家很容易找到的話,andrew就對這些點大致的介紹一下,給大家指一個方向,大家知道該自學一些什麼內容,其實andrew介紹的話,也是和別人的資料差不多,相當於複述一下,意義也不大,而且還是消耗很多時間去寫這些東西,所以,請朋友們見諒哈。


通用寄存器

AX——累加寄存器

CX——計數寄存器

DX——數據寄存器

BX——基址寄存器

SP——棧指針寄存器

BP——基址指針寄存器

SI——源變址寄存器

DI——目的變址寄存器

CPU中有8個通用寄存器,這8個寄存器都是16位的,這些寄存器既具有一般功能,也具有各自的特殊功能。

其中AX,CX,DX和BX寄存器還可以當作兩個8位寄存器使用。

AL——累加寄存器低位

AH——累加寄存器高位

CL——計數寄存器低位

CH——計數寄存器高位

DL——數據寄存器低位

DH——數據寄存器高位

BL——基址寄存器低位

BH——基址寄存器高位

在INTER的CPU中,數據在用小端模式存儲,即數據的低位放在低地址,數據的高位放在高地址。以AX寄存器爲例,如果AX寄存器中的數據爲0x1234,那麼AL裏存放的是低位0x34,AH裏存放的是高位0x12。


段寄存器

ES——附加段寄存器

CS——代碼段寄存器

SS——堆棧段寄存器

DS——數據段寄存器

段寄存器用於存放對數據訪問時的段基址。


CPU還有狀態寄存器,內存管理寄存器和控制寄存器。狀態寄存器記錄CPU運行過程中的狀態和運算結果等,內存管理寄存器用於存儲對內存方位需要的數據信息,控制寄存器控制這CPU工作的模式等。這一部分內容可以參考INTER的編程指南,大家可以在http://download.csdn.net/detail/andrew_yau/7429355

下載,andrew上傳的,可以免費下載,但好像要申請一個CSDN帳號。後面在編程的時候,也會適當的介紹一些關於寄存器的內容。


在上一次的代碼中,使用到了BIOS的0x10號中斷,andrew這裏和大家介紹一下BIOS中斷的使用。BIOS中斷爲操作系統的啓動提供了一些低級的服務,這個和編寫應用程序使用的庫函數有些像,在C語言中調用printf函數可以打印字符串,操作系統的代碼不能夠調用庫函數,但BIOS能夠給我們提供一些相關服務的功能。BIOS的參考資料andrew上傳在http://download.csdn.net/detail/andrew_yau/7429337

大家可以自由下載。andrew以上一次boot.s的代碼爲例,介紹下中斷調用的用法。

  1.     mov cx,#30  

  2.     mov dx,#0x1004  

  3.     mov bx,#0x000c  

  4.     mov bp,#msg  

  5.     mov ax,#0x1301  

  6.     int 0x10


AH=13H
BH=頁碼
BL=屬性(若 AL=00H 或 01H)
CX=顯示字符串長度
​(DH、DL)=座標(行、列)
ES:BP=顯示字符串的地址

AL=顯示輸出方式
0——字符串中只含顯示字符,其顯示屬性在 BL 中。顯示後,光標位置不變
1——字符串中只含顯示字符,其顯示屬性在 BL 中。顯示後,光標位置改變
2——字符串中含顯示字符和顯示屬性。顯示後,光標位置不變
3——字符串中含顯示字符和顯示屬性。顯示後,光標位置改變
出口參數:無
這是BIOS0x10號中斷的詳細解釋。CX寄存器存放要顯示寄存器的長度,在代碼中設置爲30個。DX中存放的是顯示座標,即在屏幕中顯示的位置。ES:BP是要顯示的字符串的地址,ES在之前已經設爲0x07c0,那麼BP即存放的是字符串大偏移地址。AH=0x13,即功能號,決定0x10號中斷執行是做什麼事情,一箇中斷號可以做很多事情,例如顯示字符串,顯示一個字符,配置顯示器等都有0x10號中斷完成,但具體完成什麼功能有AH中的功能號決定。AL中爲顯示的模式。其實BIOS的中斷調用使用起來還是很方便的。


跟着昨天的內容,昨天完成了focus的引導扇區代碼,這寫代碼只是顯示了兩行字符串,除此之外什麼都沒做。其實512字節的代碼確實能做的事情太有限了,那麼那麼大的操作系統程序,是怎麼運行呢?當然是靠引導扇區的程序了。引導扇區的代碼量少是因爲BIOS只能把一個扇區的內容拷貝到內存,這一部分作爲排頭兵,在內存中佔領了據點之後,再把操作系統剩下的代碼搬移到內存,這就是引導扇區代碼的主要內容。

搬移程序就要將程序從軟驅中讀取到內存,這就涉及到如何讀軟驅的問題了,剛剛講過的,用BIOS中斷哈,BIOS的0x13號中斷提供了對磁盤的服務。

AH=0x02;讀盤

AH=0x03;寫盤

AL=處理對象的扇區數;

CH=柱面號&0xff;

CL=(扇區號&0x3f)|((柱面號&0x300)>>2);

DH=磁頭號;

DL=驅動器號;

ES:BX=緩衝區地址

返回值:

CF=0;沒有錯誤

CF=1;有錯誤,錯誤碼在AH中


今天的代碼andrew先將引導扇區代碼加入讀盤的功能,讓其能夠加載後續的代碼。完整的代碼andrew將其放在博客中,因爲andrew考慮到,用手機來閱讀可能沒有電腦上那麼舒服,如果介紹的內容很多而且內容太專業,可能大家剛看一會就不會再看了,所以andrew決定以後微信上只介紹些概念性的,以及一些關鍵點的代碼。完整的代碼放在博客中,有興趣的朋友可以在電腦上進行學習。

謝謝。


————————————————————————

QQ:64879927

博客:http://blog.csdn.net/andrew_yau

請關注focus微信公共平臺:OS的探索之旅




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章