30天自制作業系統學習-第2天
第二天主要學習組合語言與Makefile入門
1:繼續開發
在這裡先給出作者在第二天使用nask編寫程式碼中涉及到的暫存器概念:
AX--accumulator,累加暫存器
CX--counter,計數暫存器
DX--data,資料暫存器
BX--base,基址暫存器
這四個為通用暫存器,其中AX16位暫存器可以拆分為AH8位暫存器和AL8位暫存器使用,CX,DX,BX同理
SP--stack pointer,棧指標暫存器
BP--base pointer,基址指標暫存器
IP--instructions pointer,指令指標
SI--source index,源變址暫存器
DI--destination index,目的變址暫存器
SS-stack segment,堆疊段
DS--data segment,資料段
ES--extra segment,附加段
CS--code segment,程式碼段
這裡給出helloos3.nas彙編指令:
; hello-os ; TAB=4 ORG 0x7c00 ; 指明程式的裝載地址 ; 以下的記述用於標準FAT12格式的軟盤 JMP entry DB 0x90 DB "HELLOIPL" ; 可以自由寫扇區的名字(8位元組) DW 512 ; 1扇區的大小(必需要512) DB 1 ; 叢集的大小(必需要做一個扇區) DW 1 ; FATA從這裡開始(一般是從第一扇區開始) DB 2 ; FATA的個數(必須是2) DW 224 ; 根目錄區域的大小(通常為224項) DW 2880 ; 該驅動器的大小(必須要為2880扇區) DB 0xf0 ; 媒體型別(必須要做0 xf0) DW 9 ; FATO區域的長度(必須要做9扇區) DW 18 ; 1卡車上有幾個扇區 DW 2 ; 頭數(必須要2) DD 0 ; 因為沒有使用分割槽,所以這裡一定是0 DD 2880 ; 再寫一次一個暫存器大小 DB 0,0,0x29 ; 雖然不太明白,但是放在?個價?上就好了 DD 0xffffffff ; 大概卷序列號 DB "HELLO-OS " ; 磁碟名稱(11位元組) DB "FAT12 " ; 格式名稱(8位元組) RESB 18 ; 先放18個位元組 ; 程式核心 entry: MOV AX,0 ; 初始化暫存器 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msg putloop: MOV AL,[SI] ADD SI,1 ;讓SI加1 CMP AL,0 JE fin MOV AH,0x0e ; 指明一個文字 MOV BX,15 ; 指定字元顏色 INT 0x10 ; 呼叫顯示卡BIOS JMP putloop fin: HLT ; 讓CPU停止,等待指令 JMP fin ; 無限迴圈 msg: DB 0x0a, 0x0a ; 換行兩次 DB "hello, world" DB 0x0a ; 換行 DB 0 RESB 0x7dfe-$ ; 到0x7dfe在0x00中填入的命令 DB 0x55, 0xaa ; 以下是非??扇區以外的部分的描述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
其中ORG指令指明瞭程式的裝填地址,即在記憶體中所在的地址,其中地址0X7c00為當時IBM和英特爾設計人員規定的。
HLT指令讓CPU停止,等待指令,剩下的彙編指令大致上和nasm相同。
其中day2/helllos3資料夾下的批處理檔案!cons_nt.bat和run.bat,asm.bat和第一天的相同,我們雙擊執行!cons_nt.bat,輸入asm:
成功生成了helloos.img映象檔案,接下來再輸入run命令啟動qemu虛擬機器:
2:製作真正的IPL
考慮到以後的開發,我們只需要利用nask製作一個512位元組的啟動區即可,剩下的部分我們用磁碟映像管理用具來做,這樣開發就方便了
day2/helloos4/ipl.nas修改了msg標號的指向的彙編指令,修改後如下:
msg:
DB 0x0a, 0x0a ; 換行
DB "hello, world"
DB 0x0a ; 換行
DB 0
RESB 0x7dfe-$ ; 到0x7dfe在0x00中填補的命令
DB 0x55, 0xaa
我們進一步改造asm.bat,輸入..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst:
雙擊!cons_nt.bat檔案輸入asm我們發現並沒有直接helloos.img映象檔案,而是生成一個ipl.bin和ipl.lst檔案,我們檢視其中的ipl.lst:
在helloos4中我們新建一個makeimg.bat批處理我們,它的作用是將生成的ipl.bin檔案編譯生成我們需要的helloos.img映象檔案,
makefile.bat內容:..\z_tools\edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
我們雙擊執行!cons_nt.bat輸入makeimg,生成helloos.img映象檔案:
然後我們再重新執行!cons_nt.bat輸入makeimg生成helloos.img。
再輸入run命令使用qemu虛擬機器執行我們生成的helloos.img映象檔案:
3:Makefile的入門
我們在helloos4中生成helloos.img映象檔案,並且使用qemu虛擬機器執行這個檔案,其中涉及到的批處理檔案甚至比我們實際需要的檔案還多,我們可以將這些單步的命令寫到一個檔案中去執行。
新建一個檔案,檔名為Makefile,不使用字尾,在記事本中開啟這個檔案,輸入如下語句:
#預設
default : ../z_tools/make.exe img
#檔案生成規則
ipl.bin : ipl.nas Makefile ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile ../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \ wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
# 命令
asm : ../z_tools/make.exe -r ipl.bin
img : ../z_tools/make.exe -r helloos.img
run : ../z_tools/make.exe img copy helloos.img ..\z_tools\qemu\fdimage0.bin ../z_tools/make.exe -C ../z_tools/qemu
install : ../z_tools/make.exe img ../z_tools/imgtol.com w a: helloos.img
clean : -del ipl.bin -del ipl.lst
src_only : ../z_tools/make.exe clean -del helloos.img
再新建一個make.bat,內容輸入:..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 ,然後儲存。
其中這個make.exe會根據你輸入的命令,如 asm,run,img等命令,執行對於的批處理語句。在直接輸入make run的情況下,
make.exe會檢查是否有helloos.img,如果沒有的話會執行img標號對於的批處理命令,其他情況以此類推,在你修改了其中的某些檔案時。這樣我們只需要雙擊執行!cons_nt.bat批處理檔案,輸入 make run命令會自動的生成ipl.bin,ipl.lst後,根據生成的ipl.bin檔案生成helloos.img,然後假裝qemu虛擬機器執行這個映象檔案,這樣的手段比用一堆批處理檔案高明而又簡潔多了,我們執行結果如下:
第2天的開發就這麼多啦。