【问题标题】:Print ascii character on screen在屏幕上打印 ascii 字符
【发布时间】: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 之后)。这将阻止您的引导加载程序在内存中徘徊,试图执行碰巧在内存中的随机垃圾/数据指令(这可能导致奇怪的行为、重启、挂起等)。

标签: assembly x86 nasm


【解决方案1】:
JMP $

跳到自己。删除它会让其他代码运行

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多