《30天》的彙編實現(二)

第3天
目標:1、讓主引導程序讀也軟盤的20個柱面的數據     ip110.asm
           2、設置一些系統用到的參數                              asmhead.asm
           3、跳轉到保護模式                                            bootpack.asm


一、軟盤邏輯扇區從0開始編號,每扇區佔512字節。20柱面的數據都讀取到8000H開始的內存中。
軟盤中有一些有特定作用的扇區:
0號扇區MBR,也叫主引導扇區,被BIOS自動讀取到7C00H處
1~9號扇區FAT1、10~18號扇區FAT2,FAT系列的文件系統都有2個一模一樣的FAT
19~32號扇區根目錄區,它限制了根目錄可以有多少個條目
從33號扇區開始就是數據區,很長一段時間,軟盤中只有一個文件asmhead.com,這樣此文件在數據區中就是連續的,如果有多個文件,而asmhead.com需要增減數據,就會出現數據不連續的情況,這種情況的處理,現在不討論。
asmhead.com在軟盤中的地址是33號扇區,當20柱面被讀入8000H時,asmhead.com在內存中的地址就是0C200H,所以MBR最後會跳轉到0C200H執行。
二、設置顯示模式,保存顯示模式對應的參數,保存鍵盤標誌,打開A20地址線,加載全局描述符
雖然我在代碼中寫的是“跳轉到保護模式”,其實CS寄存器並沒有工作在保護模式下
但是其它的段寄存器是工作在保護模式下的(只能算半保護模式吧),這樣程序就可以訪問1M以上的內存了
把8000H開始的20柱面的數據複製到100000H處,把完全保護模式下的代碼(bootpack.com)複製到280000H處,
設置棧頂爲310000H,跳轉到bootpack.com並轉入完全保護模式。
bootpack.asm編譯成功後,用incbin嵌入asmhead.com的後面
三、這時候已經進入完全保護模式,所有的段寄存器的高速緩存都刷新了。
在原書中,這是C語言的領域了,在第3天,只有一個代碼hlt






下面分享一下我的得意之作:宏定義
在bootpack.inc中,我定義有幾個宏用於程序控制
比如說如果eax小於0則ecx清0
if eax,l,0
xor ecx,ecx
endif
當然還有else和elseif
第2個參數是用條件跳轉指令中的字母表示的:
a、b、ae、be分別表示無符號的大於、小於、大於等於、小於等於
g、l、ge、le分別表示有符號的大於、小於、大於等於、小於等於
三個參數是通過第1參數和第3參數的cmp得到的,也可以用1個參數,通過判斷標誌位來實現
比如:
test eax,eax
if z
xor ecx,ecx
endif


循環結構是repeat until 和while  endw
比如1到100的累加:
xor eax,eax
mov ecx,1
while ecx,be,100
add eax,ecx
inc ecx
endw
或者
xor eax,eax
mov ecx,1
repeat
add eax,ecx
inc ecx
until ecx,a,100




最後是invoke子程序調用宏:
這個和masm差不多,第1個參數是子程序名,其它是參數
如果是字符串參數,則要在宏定義中更改數據段及代碼段的段名
如果是立即數入棧,直接作爲參數即可
如果是變量入棧,要有byte、word、dword的修飾
如果是直接地址入棧,與立即數入棧是一樣的
如果是變量地址入棧,要有addr修飾
比如:invoke sprintf,dword [.s],"memory %dMB     free :%dKB",edx,eax
擴展開就是:
push eax
push edx
[section .data]
%%msg db "memory %dMB     free :%dKB",0
[section .code]
push %%msg
push dword [.s]
call sprintf


嗯,就說到這裏吧,表達水平有限,大家可以下載相應的代碼


雲盤地址:http://pan.baidu.com/s/1pL5YPhL

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