day 1
工具:qemu 模擬器
今日任務(wù)
計算機(jī)啟動后,在屏幕打印一串字符串。
理論
顯示字符的原理
把一些機(jī)器指令寫在第一扇區(qū)。通過int 0x10中斷,讓顯卡在屏幕上顯示字符。只需要在0x10之前按照規(guī)定準(zhǔn)備好寄存器,顯卡就能正確顯示字符。
顯卡顯示字符的規(guī)定
流程
計算機(jī)會按照規(guī)定的流程自行啟動,初始化結(jié)束后,執(zhí)行物理內(nèi)存0x7c00處的指令。在這一步之前硬件會把磁盤上的第一個扇區(qū)(前512字節(jié))裝載到0x7c00處。打印字符串的指令和數(shù)據(jù),就是寫在這里的。
ORG指令
ORG 0x7c00
ORG指令是偽指令,它不會被CPU指令,是知道匯編器把匯編代碼編譯成機(jī)器碼的。這條指令告訴匯編器,下面內(nèi)容的起始地址是0x7c00。這樣做的目的是確定標(biāo)號的具體地址。比如如果有個標(biāo)號為entry,entry具體是多少地址,會受到ORG的影響。
實現(xiàn)代碼
這個代碼和書中的不一樣,但是能夠?qū)崿F(xiàn)同樣的功能。
ORG 0x7c00 ;偽指令,告訴編譯器第一條指令的地址是0x7c00,cpu并不執(zhí)行
MOV SI,data
putloop:
;為顯卡中斷做參數(shù)準(zhǔn)備
MOV AL,[SI] ;AL 要打印的字符
CMP AL,0
JE end
MOV AH,0x0e ;操作碼,0x0e是打印字符
MOV BL,15 ;顏色碼
MOV BH,0 ;規(guī)定填0
INT 0x10 ;顯卡中斷,填充好AL,AH,BL,BH,進(jìn)行顯卡中斷將顯示一個字符
ADD SI,1
JMP putloop
end:
HLT
JMP end
data:
DB 0x0a ;換行
DB "hello_world!"
DB 0x0a ;換行
DB 0 ;結(jié)束符
fill:
RESB 0x7dfe-$
DB 0x55,0xaa
編寫代碼時的錯誤
- 兩個操作數(shù)的指令,操作數(shù)與操作數(shù)間應(yīng)該用逗號隔開
- CMP指令比較時,操作數(shù)不能是內(nèi)存。
編譯執(zhí)行
我已經(jīng)把tolset里的ztool添加到了環(huán)境變量,所以我可以在任何地方通過命令行運(yùn)行那些工具文章來源:http://www.zghlxwxcb.cn/news/detail-601648.html
編譯
nask hello_world.asm hello_world.img
把編譯結(jié)果作為qemu磁盤的第一扇區(qū)
copy hello_world.img tolset\z_tools\qemu\fdimage0.bin
運(yùn)行qemu
make -C tolset\z_tools\qemu
運(yùn)行結(jié)果
文章來源地址http://www.zghlxwxcb.cn/news/detail-601648.html
到了這里,關(guān)于30天自制操作系統(tǒng) day 1 寫一個可以在沒有操作系統(tǒng)的計算機(jī)上輸出字符串的程序,并在計算機(jī)上運(yùn)行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!