org 07c00h ; 告诉编译器程序加载到7c00处
jmp BootSeg
;times 256 db 0
BootSeg:
mov ax, cs
mov ds, ax
mov es, ax
;置堆栈段指针
mov ax, 08FC0h
mov ss, ax
mov esp, 0FFFFh
;清屏
mov cx, 0000h
mov dx, 1850h
mov bh, 07h
mov ax, 0600h
int 10h
;置光标为左上角
mov bh, 00h
mov dx, 0000h
mov ah, 02h
int 10h
;显示 BootMessage 信息
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, BootMesSeg
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dx, 0000h
int 10h ; 10h 号中断
; 将软驱的第2—5个扇区 读到
; 内存的0500F—0700F , 共 2 Kb 大小
; 柱面号(磁道):0 ,磁头:0 ,扇区号: 2
push es
LoadSetup :
xor ah, ah
xor dl, dl
int 13h
mov ax, 0204h ;al=读入的扇区数
mov cx, 0002h
xor dx, dx
mov bx, 0050h
mov es, bx
xor bx, bx
int 13h ;13h 号中断读扇区
jc LoadSetup
;软盘控制寄存器的I/O地址为3F0 - 3F7
; mov dl, 0 ; 停止驱动器
; mov dx, 0x3f2
; mov al, 0x0c
; out dx, al
call LoadDisplay
pop es
;显示说明加载setup文件
mov ax, JmpMessage
mov bp, ax ; ES:BP = 串地址
mov cx, JmpMesSeg
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dx, 0100h
int 10h ; 10h 号中断
jmp 0000h:0500h
LoadDisplay :
push ax
push bx
mov ah,0Eh
mov al,'.'
mov bl,0Fh
int 10h
pop bx
pop ax
ret
BootMessage: db "Loading Setup..."
BootMesSeg equ $-BootMessage
JmpMessage: db "Jmp into Setup Segment"
JmpMesSeg equ $-JmpMessage
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志