org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
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 ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
代码的解释:
在NASM中,任何不被方括号[]括起来的标签和变量名都会被认为是地址,访问标签中的内容必须使用[]。
关于$和$$,$表示当前被汇编后的地址,
ndisasm -o 0x7c00 boot.bin >> disboot.asm
00007C09 EBFE jmp short 0x7c09。
$$表示一个节的开始处被汇编后的地址,也就是0x7c00。
在程序中$-$$经常会被用到。
times 510-($-$$) db 0;表示将0重复510-($-$$)遍,也就是在剩下的空间里不停的填充0,直到程序有510B为止。这样加上结束0xAA55,正好512B。
阅读(2297) | 评论(0) | 转发(1) |