關於上一節,我測試了發現3e、4c、4e都OK ,4b 4d 4f都進不去系統還把qemu卡死了。 50不會輸出HelloWorld,可能須要hex偶數且在0x3e~4f區間吧。上節複製並運行命令以下:html
View Codecopy /y helloos-Copy.img ..\z_tools\qemu\fdimage0.bin && ..\z_tools\make.exe -C ../z_tools/qemu
先無論上一節了,這節咱們寫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的功能
事實上:
也就是說標籤名錶明瞭標籤所在地址
大概就是這樣了,具體看書裏的便可
重要參考資料: