boot.asm

来源:互联网 发布:c语言入门自学 编辑:程序博客网 时间:2024/04/30 03:09


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    ; 结束标志

原创粉丝点击