;用 bios提供的 int 13h 中断把存放在磁盘的第2和第3个扇区的setup.s 加载到内存起始地址 0x9020:0000
;假定用floopy disk并且setup.s大小不超过1024字节
; ah = 2 read, ah = 3 write
; al: section
; ch:
load_setup:
;目标地址
mov ax, #0x9020
mov es, ax
xor bx, bx
; sector 2, track 0
mov cx, #0x0002
;drive 0, head 0
mov dx, #0x0000
;service 2
mov ah, #0x2
;需要加载2个扇区
mov al, #0x2
int 0x13
;加载成功就跳转到load_setup_ok
jnc load_setup_ok
;如果加载失败就需要重新跳转到load_setup再次加载
mov dx, #0x0000
mov ax, #0x0000
int 0x13
jmp load_setup
;加载成功后就可以跳转到0x9020:0000处执行setup.s代码了。
load_setup_ok:
;执行setup.s前调用bios中断int 0x10打印一点boot.s完成的信息。
;恢复 es 寄存器 to 0x9000,否则无法正确访问到msg数据了。
mov ax, #0x9000
mov es, ax
mov ah, #0x03
xor bh, bh
int 0x10
;打印数据长度为24字节
mov cx, #24
; page 0, attribute 7
mov bx, #0x0007
mov bp, #msg
; write string and move cursor
mov ax, #0x1301
int 0x10
; 跳转到 0x9020:0000执行setup.s代码
jmpi 0x0, 0x9020
;要打印的数据定义区
msg:
.byte 13,10
.ascii "Loading system ..."
.byte 13,10,13,10
;填充剩余的空间一直到510字节偏移处
.org 510
;根据bios的标准最后两个字节内容必须是0xaa55
boot_flag:
.word 0xaa55