赞
踩
- # boot引导
-
- org 0x7c00 # org 用于指定程序的起始地址 BIOS会加载引导程序到内存地址0x7c00处
- BaseofStack equ 0x7c00 # 将标识符BaseOfStack 等价为数值0x7c00
- Label_Start:
- mov ax, cs ; 将寄存器cs的段基地址设置到DS ES SS等寄存器中,以及设置栈寄存器SP
- mov ds, ax
- mov es, ax
- mov ss, ax
- mov sp, BaseofStack # sp栈指针寄存器
=========================================================================
- ;===============clear screen 上卷指定范围窗口
-
- mov ax, 0600h
- mov bx, 0700h
- mov cx, 0000h
- mov dx, 0184fh
- int 10h
-
=========================================================================
- ;===============set focus 设置光标位置
-
- mov ax, 0200h
- mov bx, 0000h
- mov dx, 0000h
- int 10h
=========================================================================
- ;============display on screen : start booting....
-
- mov ax, 1301h
- mov bx, 000fh
- mov dx, 0000h
- mov cx, 10
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, startBootMessage
- int 10h
=========================================================================
- ;======== reset floppy
- xor ah,ah
- xor dl,dl
-
- jmp $
=========================================================================
times 510 - ($ - $$ ) db 0
其中,表达式 $ - $$
的意思是,将当前行被编译后的地址(机器码地址)减去本节(Section )程序的起始地址。由于Boot引导程序只有一个以0x7c00为起始地址的节,那么表达式 $ - $$
的作用是计算出当前程序生成的机器码长度,进而可知引导扇区必须填充的数据长度 (510 -($ - $$) )
又因为软盘是个块设备,访问块设备的特点是每次必须以扇区为单位(512B),而times伪指令恰好可以实现多次重复操作,所以这行汇编代码的目的是,通过times伪指令填充引导扇区剩余空间,以保证生成的文件大小为512B。- startBootMessage: db "start Boot"
-
- ;=========fill zero until whole sector
-
- times 510-($-$$) db 0
- dw 0xaa55
总体代码:
- org 0x7c00
- BaseofStack equ 0x7c00
-
- Label_Start:
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov ss, ax
- mov sp, BaseofStack
-
-
- ;===============clear screen
- mov ax, 0600h
- mov bx, 0700h
- mov cx, 0
- mov dx, 0184fh
- int 10h
-
-
- ;===============set focus
-
- mov ax, 0200h
- mov bx, 0000h
- mov dx, 0000h
- int 10h
-
-
-
- ;============display on screen : start booting....
-
- mov ax, 1301h
- mov bx, 000fh
- mov dx, 0000h
- mov cx, 10
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, startBootMessage
- int 10h
-
- ;======== reset floppy
- xor ah,ah
- xor dl,dl
-
- jmp $
-
- startBootMessage: db "start Boot"
-
- ;=========fill zero until whole sector
-
- times 510-($-$$) db 0
- dw 0xaa55
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。