;%define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!
%ifdef _BOOT_DEBUG_
org 0100h ; 调试状态, 做成 .COM 文件, 可调试
; COM文件必须开始于0100H。EXE和COM的区别下面再讲(1)
%else
org 07c00h ; Boot 状态,
; Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
; 引导扇区必须开始于07C00H
%endif
mov ax, cs ; 代码段地址-->AX寄存器
mov ds, ax ; 把代码段地址复制到数据段和附加段中
mov es, ax ; 这是因为COM程序只有一个段,
; 因此代码、数据和堆栈都是一样的地址(2)
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环,$在NASM中表示当前行的内存地址
DispStr:
mov ax, BootMessage ; 把要显示的字符串地址复制到AX中,
; NASM中不需要OFFSET
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; int 10h,调用BIOS的10H中断,
; 前面的BP、CX、AX、BX、DL都是参数(3)
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
; times是NASM的专用指令,
; 表示把后面定义的0填充当前位置510-($-$$)次
dw 0xaa55 ; 结束标志,引导扇区必须以0XAA55结尾