最小操作系统的代码解释、NASM的初步使用
一、最小操作系統(tǒng)的代碼解釋
?
? ? 很多資料上都有最小操作系統(tǒng)代碼,即從裸機(jī)開始運(yùn)行、引導(dǎo)機(jī)器、顯示 hello world 并進(jìn)入循環(huán)等待的代碼;下面對(duì)代碼進(jìn)行一下大體的解釋;
?
org 07c00h; 告訴編譯器程序加載到7c00處 mov ax, cs mov ds, ax call DispStr; 調(diào)用顯示字符串例程 jmp $; 無(wú)限循環(huán) DispStr: mov ax, BootMessage mov bp, ax; ES:BP = 串地址 mov cx, 16; CX = 串長(zhǎng)度 mov ax, 01301h; AH = 13, AL = 01h mov bx, 000ch; 頁(yè)號(hào)為0(BH = 0) 黑底紅字(BL = 0Ch,高亮) mov dl, 0 int 10h; 10h 號(hào)中斷 ret BootMessage:db "Hello, OS world!" times 510-($-$$) db 0; 填充剩下的空間,使生成的二進(jìn)制代碼恰好為512字節(jié) dw 0xaa55; 結(jié)束標(biāo)志?
?
1 ORG和07C00h
ORG偽指令告訴匯編器: ?我的程序?qū)?lái)會(huì)被加載到某某地址A;
ORG是Origin的縮寫:起始地址,源。在匯編語(yǔ)言源程序的開始通常都用一條ORG偽指令來(lái)實(shí)現(xiàn)規(guī)定程序的起始地址。如果不用ORG規(guī)定則匯編得到的目標(biāo)程序?qū)?000H開始。
匯編語(yǔ)言源程序中若沒(méi)有ORG偽指令,則程序執(zhí)行時(shí),指令代碼被放到自由內(nèi)存空間的CS:0處;若有ORG偽指令,編譯器則把其后的指令代碼放到ORG偽指令指定的偏移地址。
?
FFFF0h與07C00h,這兩個(gè)都是機(jī)器啟動(dòng)后默認(rèn)訪問(wèn)的內(nèi)存地址。
bios是用來(lái)初始化硬件的最底層的軟件(然后才是操作系統(tǒng)),因此計(jì)算機(jī)啟動(dòng)后必須最先被執(zhí)行。
CPU只能執(zhí)行內(nèi)存中的內(nèi)容的,而內(nèi)存中的數(shù)據(jù)是斷電之后內(nèi)容就會(huì)消失。工程師的解決方法是:將存放bios的rom芯片與內(nèi)存芯片統(tǒng)一編址(不明白的話去看微機(jī)原理與接口的書)。這樣就可以把存放bios的ROM芯片看作是數(shù)據(jù)永遠(yuǎn)不會(huì)消失不允許被更改的內(nèi)存了。
開機(jī)啟動(dòng)后默認(rèn)的CS=FFFFh IP=0000h。這個(gè)地址就是bios的地址。這段內(nèi)存空間很小,不能夠容下操作系統(tǒng)等大型程序。
機(jī)器啟動(dòng)后自動(dòng)執(zhí)行bios使其完成硬件初始化。bios完成硬件初始化的任務(wù)后,就要把權(quán)力移交給操作系統(tǒng)。
工程師進(jìn)行了強(qiáng)制性的規(guī)定:到內(nèi)存中的07c00h 處尋找系統(tǒng)的引導(dǎo)程序,即CS=0000h IP=7c00h。也就是說(shuō)任何系統(tǒng),他的引導(dǎo)程序都必須安排在07c00h開始的地方,否則就不能被正確的引導(dǎo)。當(dāng)引導(dǎo)程序完成后我們就進(jìn)入了Linux Windows等系統(tǒng)了。
(還可以把org 07c00h改為0100h,生成 com文件就能直接在dos下運(yùn)行。)cx表示的是字符串的個(gè)數(shù),10進(jìn)制的,可以自行修改,boot sector的結(jié)束地址也是固定的,為0xAA55。
?
2 10h中斷
10H中斷是由BIOS對(duì)顯示器和屏幕所提供的服務(wù)程序。使用int 10h服務(wù)程序時(shí),必須先指定ah寄存器為顯示服務(wù)編號(hào)之一,以指定需要調(diào)用的功用。
ah=13h, 在Teletype模式下顯示字符串。
AH=13H
BH=頁(yè)碼
BL=屬性(若AL=00H或 01H)
CX=顯示字符串長(zhǎng)度
(DH、DL)=坐標(biāo)(行、列)
ES:BP=顯示字符串的地址 AL=顯示輸出方式
0—— 字符串中只含顯示字符,其顯示屬性在BL中。顯示后,光標(biāo)位置不變
1——字符串中只含顯示字符,其顯示屬性在BL中。顯示后,光標(biāo)位置改變
?
3 JMP $
$,代表當(dāng)前地址。
$ 放在 LJMP 之后,它就代表這條指令本身的地址。
JMP $,就是轉(zhuǎn)移到該指令的本身地址。
JMP $,就是原地轉(zhuǎn)移的意思,即 死循環(huán)。
一旦有中斷發(fā)生,就可以去執(zhí)行中斷程序。
4 填充
$-$$可能會(huì)經(jīng)常被用到,它表示本行距離程序開始處的相對(duì)距離。
times 510-($-$) ?db ?0 ?的意思就是將0這個(gè)字節(jié)重復(fù)510-($-$)遍,知道程序有510B為止。這樣,加上結(jié)束標(biāo)志0XAA55占用2B,恰好是512B
?
5 引導(dǎo)扇區(qū)
Boot Sector原理如下:當(dāng)計(jì)算機(jī)被電源打開時(shí),他先會(huì)進(jìn)行加電自檢(POST),然后尋找啟動(dòng)盤,如果選擇是從軟盤啟動(dòng),計(jì)算機(jī)就會(huì)檢查軟盤的0面0磁道1扇區(qū),如果發(fā)現(xiàn)它是以0xAA55結(jié)束,則BIOS就會(huì)認(rèn)為他是一個(gè)引導(dǎo)扇區(qū)。
一旦BIOS發(fā)現(xiàn)了引導(dǎo)扇區(qū),就會(huì)將這512B的內(nèi)容裝載到內(nèi)存0000:7c00處;
?
二 NASM的初步使用
上面代碼是NASM語(yǔ)法,和微軟的MASM有所區(qū)別。需要用NASM編譯。
masm是微軟專門為windows下匯編而寫的,而nasm可以在windows、linux等系統(tǒng)下匯編。
安裝NASM;
把上述代碼保存為boottest.asm,然后用NASM構(gòu)建;
如下圖構(gòu)建為.bin文件;
nasm boottest.asm -o boottest.bin
此段代碼如果放到emu8086中編譯;
times 510-($-$$) ? db ? 0,這句會(huì)出錯(cuò);
emu8086的編譯是MASM語(yǔ)法,沒(méi)有times指令;
?
三 看一下boot文件大小
看一下構(gòu)建成功以后的引導(dǎo)文件大小,正好是512字節(jié);
一個(gè)引導(dǎo)扇區(qū)是512個(gè)字節(jié),并且以0xAA55為結(jié)束標(biāo)識(shí)的扇區(qū);
這個(gè)就是最小操作系統(tǒng)的含義,以及?times 510-($-$) ?db ?0 這句填充的作用;
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的最小操作系统的代码解释、NASM的初步使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个网页菜单的CSS代码分析
- 下一篇: Java Struts 特性和新特性总结