【发布时间】:2020-04-06 06:43:34
【问题描述】:
我正在尝试用电传打字机打印符号。 这是一段代码:
mov al, [smb]
int 0x10
smb: db "X"
但事实证明,这显示了来自内存而不是来自该位置的任意符号。似乎 [] 返回符号的相对地址。这可能是意料之中的,但问题是:我怎样才能找到绝对地址? 我正在使用 QEMU-i386,与标准 NASM 组装。
附:在查看了与 NASM 相关的其他问题后:请不要告诉我去查看 NASM 的文档,因为这里有很多人问了很多关于 C# 的简单问题,但这些问题并没有发送给 Richter。
【问题讨论】:
-
mov al, [smb]将smb处的字节(本例中为X)移动到AL。这可能是您想要做的。我假设您已将0x0e移至 AH 以通过 BIOS 服务 int 10h 进行 TTY 输出调用。您可能想在 int 0x10 和下面的数据之间放置一个无限循环或其他东西,这样您就不会失败并开始将代码作为数据执行。但如果我不得不猜测,您的问题可能是 DS 段寄存器指向错误的段。如果您展示了所有代码,那将有所帮助。我猜您可能是在某种引导加载程序或第一阶段执行此操作? -
另一种可能性是您没有根据代码的预期设置 ORG 语句。例如,在 bootloader 中,我通常在 NASM 文件的顶部使用
ORG 0x7c00,然后在引导加载程序代码的顶部,我将 DS 设置为 0,使用类似xor ax,axmov ds, ax -
谢谢!即使没有将 DS 设置为 0x00,调用 ORG 0x7c00 也有效。是的,我正在为一个爱好项目构建一个简单的引导扇区
标签: assembly nasm x86-16 qemu real-mode