【发布时间】:2016-06-28 19:56:09
【问题描述】:
我正在用汇编(NASM 指令集)编写引导加载程序,但由于某种原因它没有显示任何字母。
[BITS 16]
[ORG 0x7C00]
JMP $
MOV AL, 0x65
MOV AH, 0x0E
MOV BL, 0x07
MOV BH, 0x00
INT 0x10
TIMES 510 - ($ - $$) db 0
DW 0xAA55
我看到的只是 _ 光标。
【问题讨论】:
-
JMP $不是死循环吗? -
没有。它跳到自己,并且在其他指令之前。如果您使用过调试器(例如在 bochs 或 qemu 中),您会自己发现这一点。另请参阅x86 tag wiki。
-
哦,谢谢。我删除了它,它现在可以工作了。
-
在
TIMES 510 - ($ - $$) db 0$是当前程序计数器,$$是节开头的程序计数器(在这种情况下是文件的开头)。$$在这种情况下是 7c00h。($-$$)然后将是当前已发出的字节数和数据数。510-($-$$)会将文件填充到 510 字节的字节数。 TIMES 使用db 0(实际上是零填充)有效地填充了程序计数器到第 510 个字节之间的空间。引导签名从字节 510 和 511 开始写入,创建 512 二进制映像。 -
您应该将
JMP $作为引导加载程序的最后一条指令(就在INT 0x10之后)。这将阻止您的引导加载程序在内存中徘徊,试图执行碰巧在内存中的随机垃圾/数据指令(这可能导致奇怪的行为、重启、挂起等)。