bootloader 部分笔记
bootloader 比较枯燥,主要是对各个寄存器进行设置,然后进行 BIOS 的 int10H 调用。需要用到一些汇编的知识,这里简要记录一些要点。
BIOS int10H
第十七个中断向量(interrupt vector),通常在实模式用于设置显示服务。需要配合 AH 一起使用,指定其子函数。
清屏功能
AH = 06H,向上滚动窗口 AL = 00H,这时开启清屏功能 BH 指定颜色属性,其余寄存器可暂时忽略(07 即为黑底白字)
设置 focus
AH = 02HBH 为页码 DH 为行数 DL 为列数
显示字符串
AH = 13HAL 为写入模式 BH 为页码 BL 为颜色 CX 存放字符串长度 DH 为游标坐标行号 DL 为游标坐标列号 ES:BP 需要设置为字符串的偏移地址
汇编要点
org 指令,设置程序的起始段,避免再需要的地方手动就设置 0x7c00(主要影响绝对地址寻址指令)。最简单的显示字符串程序共用了代码断和数据段 /extra 段,因此数据段放到了最后。
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