這本書作者是日本人,雖然書翻譯為中文,但是源**裡注釋都是日文,對不懂日語的人來說看起來不夠方便,我把書本中給出的注釋翻譯,以及書本介紹的一些知識,加到了注釋裡,閱讀起來能夠方便些。
前3天主要就是寫乙個ipl程式(initial program loader啟動程式載入器),不論是用二進位制編輯器直接寫機器指令還是用彙編生成二進位制程式,最終目的都是得到第乙個扇區的512位元組的啟動程式。
0x10號bios函式用於顯示文字
0x13號bios函式提供磁碟的讀,寫,扇區校驗,尋道操作,ah=0x02讀盤操作
這兩個bios函式呼叫時以暫存器的值為引數,提供相應操作。
; haribote-ipl
; tab=4
cyls equ 10 ;
org 0x7c00 ;org偽指令,編譯不生成機器**,用於給鏈結器定位用,將程式裝載到記憶體的指定位置
;0x7c00~0x7dff 512位元組放置啟動程式
; 標準fat12格式軟盤專用的**
jmp entry ;jmp跳轉 至標籤entry處;jmp 0x7c50 沒問題,jmp跳轉到的就是記憶體位址
db 0x90 ;db即data byte 往檔案裡寫入乙個位元組,dw寫乙個word,16位,dd寫double word,32位
db "haribote" ;啟動區的名稱,可以是任意的字串(8位元組)
dw 512 ;每個扇區(sector)的大小(必須為 512位元組)
db 1 ;簇(cluster)的大小(必須為 1 個扇區)
dw 1 ;fat(file allocation table:檔案配置表)的起始位置(一般從第乙個扇區開始)
db 2 ;fat的個數,必須為2
dw 224 ;根目錄的大小(一般設成224項)
dw 2880 ;該磁碟的大小(必須為2880個扇區)
db 0xf0 ;磁碟的種類(必須為0xf0)
dw 9 ;fat的長度(必須是9扇區)
dw 18 ;乙個磁軌(track)有幾個扇區(必須是18)
dw 2 ;磁頭數(必須是2)
dd 0 ;不使用分割槽,必須是0
dd 2880 ;重寫一次磁碟大小
db 0,0,0x29 ;意義不明,固定
dd 0xffffffff ;(可能是)卷標號碼
db "hariboteos " ; 磁碟的名稱(11位元組)
db "fat12 " ; 磁碟格式名稱(8位元組)
resb 18 ; reserve word 從當前位址空出18個位元組,nask會把這18個位元組填充為0x00
entry:
mov ax,0 ;ax accumulator 累加暫存器 (16位)把0複製到ax中,初始化ax
mov ss,ax ;ss stack segment 棧段暫存器 (16位)
mov sp,0x7c00 ;sp stack pointer 棧指標暫存器(16位)
mov ds,ax ;ds data segment 資料段暫存器(16位)
mov ax,0x0820 ;mov al,[es:bx] 代表es*16+bx的記憶體位址
;0x7c00~0x7dff用於啟動區,0x7e00~0xfbff沒有特別的用途,作業系統隨便用
;緩衝區位址,將要把軟盤上讀取的資料放到0x8200之後,記憶體分布圖上0x8000後無人使用
;0x8000~0x81ff留給啟動區,將啟動區內容讀到這裡
mov es,ax ;es extra segment 附加段暫存器(16位) es=0x0820,bx=0
mov ch,0 ;ch counter high 計數暫存器高位(8位) 柱面0
mov dh,0 ;dh data high 資料暫存器高位(8位) 磁頭0
mov cl,2 ;cl counter low 計數暫存器地位(8位) 扇區2,計數讀的扇區標號
readloop:
mov si,0 ;si source index 源變址暫存器(16位) 記錄失敗
retry:
mov ah,0x02 ;ah accumulator high 累加暫存器高位(8位) ax=0x02 讀盤
mov al,1 ;al accumulator low 累加暫存器低位(8位) al=1 1個扇區
mov bx,0 ;bx base 基址暫存器(16位)
mov dl,0x00 ;dl data low 資料暫存器低位(8位) a驅動器
int 0x13 ;int interrupt 軟體中斷指令,暫且當作函式呼叫 呼叫磁碟bios
jnc next ;jump if not carry 如果進製標誌為0,跳轉至next 0x13呼叫有錯標誌為1,無錯為0
add si,1 ;si加1
cmp si,5 ;比較si和5
jae error ;jump if above or equal si>=5時跳轉到error
mov ah,0x00 ;
mov dl,0x00 ;a驅動器
int 0x13 ;重置驅動器
jmp retry ;無條件 跳轉到retry
next:
mov ax,es ;把記憶體位址後移0x200 512位元組 512/16=0x20 [es:bx]
add ax,0x0020 ;
mov es,ax ;沒有add es,0x20指令
add cl,1 ;cl+1
cmp cl,18 ;比較cl和18(1-18 18個扇區)
jbe readloop ;jump if below or equal cl<=18 跳轉到readloop
mov cl,1 ;扇區標號更新為1
add dh,1 ;磁頭數+1,讀磁碟反面
cmp dh,2 ;比較dh 2
jb readloop ;jump if below dh<2 時跳轉到readloop
mov dh,0 ;磁頭初始化為0
add ch,1 ;柱面+1
cmp ch,cyls ;比較ch 和 cyls=10
jb readloop ;jump if below ch<10 跳轉到readloop
;空軟盤儲存檔案時,檔名會寫在0x2600以後的地方,檔案內容會寫在0x4200以後
mov [0x0ff0],ch ;把磁碟裝載位址的結束寫到記憶體0x0ff0處
jmp 0xc200 ;程式從啟動區開始,把磁碟上的內容裝載到記憶體0x8000號位址,磁碟0x4200處的內容應該位於
;0x8000+0x4200=0xc200號位址
error:
mov si,msg ;msg位址複製到si
putloop:
mov al,[si] ;表示記憶體位址,這句是把記憶體位址為si的資料複製到al中
add si,1 ;si+1
cmp al,0 ;比較al和0
je fin ;jump if equal
mov ah,0x0e ;
mov bx,15 ;
int 0x10 ;呼叫bios 0x10號函式
jmp putloop ;
fin:
hlt ;cpu停止動作,進入待機狀態,外部發生變化,比如按下鍵盤,cpu會甦醒過來,繼續執行程式
jmp fin ;無限迴圈
msg:
db 0x0a,0x0a ;2個換行
db "load error" ;db直接寫字串,組合語言自動查詢編碼
db 0x0a ;換行
db 0 ;標誌msg結束
resb 0x7dfe-$ ;$指示當前行在檔案中所處的位元組數;在使用org指令後
db 0x55,0xaa ;軟盤的第0x1fe即第510位元組開始處必須為55 aa
《30天自製作業系統》學習筆記 helloos0
本文 一 軟體 檔案 說明 1.cons nt.bat檔案 這是一種批處理檔案,可以直接執行指令。本檔案在這裡的作用相當於cmd,用記事本檢視其內容是,也即是cmd。2.cons 9x.bat檔案 和 cons nt.bat作用相同,只是用於windows95平台,所以相應的程式為command。3...
《30天自製作業系統》學習筆記(一)
一 組合語言 一 暫存器 ax accumulator 累加暫存器 al ah cx counter 計數暫存器 cl ch dx data 資料暫存器 dl dh bx base 基址暫存器 bl bh sp stack pointer 棧指標暫存器 bp base pointer 基址指標暫存器...
《30天自製作業系統》學習筆記(三)
一 指標相關 目的 達到效果 mov byte i i 0x0f 使用c語言直接操作記憶體 做法 int i char p p char i p i 0x0f 二 顯示控制 一 色號設定。採用調色盤模式,有程式設計師自己指定顏色編號。二 調色盤使用步驟。禁止中斷 將想要設定的調色盤號碼寫入0x03c...