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