1. 程式人生 > >30天自制作業系統學習-第2天

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天的開發就這麼多啦。