第3天:進入32位模式並導入C語言
一些BIOS命令
- AH=0x00 調用顯卡模式,此後可以通過設置AL來進行顯卡設置
- AH=0x02 讀盤
- AH=0x03 寫盤
- AH=0x04 校驗
- AH=0x0c 尋道
- AL=處理對象的扇區數
- CH=柱面號
- DH=磁頭號
- DL=驅動器號
磁盤講解
- C0-H0-S1 柱面0,磁頭0,扇區1。磁頭在一個磁盤的正反面,共兩個,相當於正反盤面;柱面、磁頭都從0開始編號,扇區從1開始編號。
- 用二進制編輯器打開磁盤映像文件,發現文件名會寫在0x002600之後,文件內容會寫在0x004200之後。
彙編語言講解
-
ES:BX 這種方式表示地址,實際地址意爲ES*16+BX。ES叫做段寄存器,定位一個區域,BX是偏移。MOV AL,[ES:BX] 意爲將內存ES*16+BX處的值賦給寄存器AL。如果不寫段寄存器,寫成MOV AL,[BX],則默認的段寄存器是DS,這個句子相當於MOV AL,[DS:SI].
-
JC 跳轉指令,是"Jump if carry"的縮寫。如果進位標誌是1,就跳轉。進位標誌位寄存器爲CF: counter flag.
JC error 如果進位標誌是1,就跳轉到error標號處。
-
JNC 跳轉指令,“Jump if not carry”.如果進位標誌是0就跳轉
JNC fin
-
JAE 跳轉指令,“Jump if above or equal”.如果上文的CMP X,C指令判斷得X>=C,則跳轉
CMP SI,5
JAE error
-
JBE 跳轉指令,“Jump if below or equal”.小於等於則跳轉
-
JB 跳轉指令,“Jump if below”.小於則跳轉
-
EQU 常數賦值語句,“equal”,相當於#define. CYLS EQU 10意爲CYLS=10.
-
RET 相當於return,彙編中的“返回”
彙編函數
下面是一段彙編程序實現的函數,見原書P62,文件夾harib00j
;naskfunc
;TAB=4
[FORMAT "WCOFF"] ; 製作目標文件的模式
[BITS 32] ; 製作32位模式用的機械語言
;製作目標文件的信息
[FILE "naskfunc.nas"] ;源文件名信息
GLOBAL _io_hlt ;程序中包含的函數名
;以下是實際函數
[SECTION .text] ;目標文件中寫了這些之後再寫程序
_io_hlt: ; void io_hlt(void);
HLT
RET