bootloader 比較枯燥,主要是對各個寄存器進行設置,而後進行 BIOS 的 int10H 調用。須要用到一些彙編的知識,這裏簡要記錄一些要點。函數
第十七個中斷向量(interrupt vector),一般在實模式用於設置顯示服務。須要配合 AH 一塊兒使用,指定其子函數。this
AH = 06H,向上滾動窗口
AL = 00H,這時開啓清屏功能
BH 指定顏色屬性,其他寄存器可暫時忽略(07即爲黑底白字)spa
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.binqemu-system-x86_64 boot.bin字符串