操做系統學習筆記(1)

bootloader 部分筆記

bootloader 比較枯燥,主要是對各個寄存器進行設置,而後進行 BIOS 的 int10H 調用。須要用到一些彙編的知識,這裏簡要記錄一些要點。函數

BIOS int10H

第十七個中斷向量(interrupt vector),一般在實模式用於設置顯示服務。須要配合 AH 一塊兒使用,指定其子函數。this

清屏功能

AH = 06H,向上滾動窗口
AL = 00H,這時開啓清屏功能
BH 指定顏色屬性,其他寄存器可暫時忽略(07即爲黑底白字)spa

設置 focus

AH = 02H
BH 爲頁碼
DH 爲行數
DL 爲列數3d

顯示字符串

AH = 13H
AL 爲寫入模式
BH 爲頁碼
BL 爲顏色
CX 存放字符串長度
DH 爲遊標座標行號
DL 爲遊標座標列號
ES:BP 須要設置爲字符串的偏移地址code

彙編要點

org 指令,設置程序的起始段,避免再須要的地方手動就設置 0x7c00(主要影響絕對地址尋址指令)。
最簡單的顯示字符串程序共用了代碼斷和數據段/extra 段,所以數據段放到了最後。blog

org 0x7c00 ; set origin as 0x7c00

mov ax, cs
mov es, ax ; es is equal to cs in this case

; using int10h ah=06, al = 0 to clear screen
mov ax, 0600h
mov bx, 0700h; black background and white color
mov cx, 0000h
mov dx, 0xffff
int 10h

; using int10h, ah = 02h to set focus
mov ax, 0200h
mov bx, 0000h
mov dx, 0000h
int 10h

; show string
mov ax, 1301h; AL = 01 indicates that after display string, the cursor will be the end
mov bx, 0007h
mov dx, 0000h
mov cx, 10; length of string
mov bp, DisplayString
int 10h

jmp $

DisplayString: db "Hello Boot"

times 510 - ($ - $$) db 0

db 0x55, 0xaa

輸出效果

使用 nasm 編譯,qemu 運行便可看到屏幕的輸出ip

nasm -f bin boot.asm -o boot.bin

qemu-system-x86_64 boot.bin字符串

clipboard.png

參考

相關文章
相關標籤/搜索