《30天自制操做系統》筆記4 --- (Day2 下節)瞭解如何用匯編寫操做系統中的HelloWorld BIOS中斷大全

關於上一節,我測試了發現3e、4c、4e都OK ,4b 4d 4f都進不去系統還把qemu卡死了。 50不會輸出HelloWorld,可能須要hex偶數且在0x3e~4f區間吧。上節複製並運行命令以下:html

copy /y helloos-Copy.img ..\z_tools\qemu\fdimage0.bin && ..\z_tools\make.exe -C ../z_tools/qemu
View Code

 

先無論上一節了,這節咱們寫HelloWorld數組

看不清請右擊「重新窗口打開圖片」,下爲P29 P39兩頁對照app

 

 MOV就是賦值,沒什麼難的。因此咱們用P39來研究,方便一點。ide

既然C語言是順序結構,那彙編就更是了(事實上的確是),因此咱們先挑後面容易的打印字符部分來看函數

H、L是寄存器高低位,高位0x0e爲當前光標處顯示字符功能,低位爲字符內容(這裏經過把數組每一個元素賦值給加法寄存器低位)oop

這一段是這麼執行的(C語言的標籤):entry => putloop(循環n次) => fin(無限次循環)post

goto 就是跳轉到標籤所在位置,並從標籤開始往下執行。如測試

int i = 0;

try:
    printf("%s", "Hello");
    i--;
go: 
    printf("%s", "World");
to:     
    if (i < 0)
        goto try;

這個會執行try => go => to,再跳轉到try,從新try go to這樣順序執行下來。(直到i<0才中止)字體

 

再看msg標籤部分url

按照ASCII碼錶,這個msg明顯就是"\n\nhello, world\n\0"嘛,'\0'是字符串結束符 (NUL),'\0a'是換行符'\n'(LF)

 關於HLT,總之就是暫停並等下一次操做。這裏是爲了節省cpu資源

 該彙編指令是處理器「暫停」指令。「暫停」 HaLT,沒有操做數[1] 
功能:
使程序中止運行,處理器進入暫停狀態,不執行任何操做,不影響標誌。
當復位(外語:RESET)線上有復位信號、CPU響應非屏蔽中斷、CPU響應可屏蔽中斷3種狀況之一時,CPU脫離暫停狀態,執行HLT的下一條指令。

那個輸出字符到屏幕的功能是這樣實現的:

這裏有一個的INT 0x10是一個叫BIOS中斷的東西,參考: BIOS 中斷向量表 和 BIOS中斷大全

看了一下,從我開始找操做系統相關的資料到如今,基本上有用的全面的資料都能在維基百科裏找到...沒有科學就絕望了

 做者說沒法顯示字體顏色,應該就是這個緣由吧?

 

 


 

研究完了打印部分,咱們來看最主要的部分,給寄存器賦值部分

 

AX = 0

而後注意,SS = AX是把AX的值賦給SS,AX的值是數值0 但並非地址。因此這一列就只是將AX SS DS ES都初始化爲0,

而SP = 0X7C00 和 SI = msg 纔是這部分的重點

 

因此咱們得找一下 棧指針和源變址 兩個寄存器的做用

這麼多寄存器,咱們得找一下他們的做用:

寄存器速記(第二個字母)

S segment 段寄存器
X 基於八的extend 16位寄存器
P pointer 指針寄存器

 

 

 

寄存器名(省略寄存器三字):

AX 加法(add)

SS 棧段(Stack segment)

SP 棧指針

 

DS 數據段

ES 附加段(extra)

 

 

我猜:

SP棧指針 指向整個程序/操做系統開始的地方

SI存放msg標籤的數據,即"\n\nhello, world\n\0",而後由以後的程序把SI所存的地址值不斷+1並不斷賦值給AL(這個寄存器存放着須要中斷變量/函數INT 10要打印的字節),相似於c語言的data = a[++i],而且判斷AL == 0成立時跳出循環,以此實如今屏幕上打印HelloWorld的功能

 

事實上:

 

 

 也就是說標籤名錶明瞭標籤所在地址

大概就是這樣了,具體看書裏的便可

 

 

重要參考資料:

相關文章
相關標籤/搜索