首页 > 解决方案 > NASM。方括号返回相对位置。如何找到绝对?

问题描述

我正在尝试用电传打字机打印符号。这是一段代码:

mov al, [smb]
int 0x10

smb: db "X"

但事实证明,这显示了来自内存而不是来自该位置的任意符号。似乎 [] 返回符号的相对地址。这可能是意料之中的,但问题是:我怎样才能找到绝对地址?我正在使用 QEMU-i386,与标准 NASM 组装。

PS 在查看了与 NASM 相关的其他问题后:请不要告诉我去查看 NASM 的文档,因为更多的人在这里问了很多关于 C# 的简单问题,但它们并没有发送给 Richter。

标签: assemblynasmx86-16qemureal-mode

解决方案


对于 64 位代码;默认是绝对寻址,要获得 RIP 相对寻址,您可以使用类似mov al, [rel smb]. 然而; 可以使用DEFAULT REL指令更改默认值;在这种情况下,如果你想要绝对寻址,你会使用类似mov al, [abs smb].

适用于 16 位和 32 位代码;绝对寻址是唯一的选择(忽略可能不必要的“绝对地址编码为相对位移”的混淆,这种混淆发生在一些跳转和调用中,这对于 没有关系mov al, [smb])。

对于这两种情况(16 位和 32 位代码,以及 64 位代码);“绝对寻址”实际上是从段基址的绝对偏移量。例如,mov al, [smb]将隐式使用DS段,所以如果 DS 段的基地址不为零(这仅适用于 32 位和 16 位代码 - 对于 64 位代码,只有 FS 和 GS 可以有段基址) 实际的绝对地址将是“段基址 + 绝对偏移量”。如果段基数为零,则可以忽略(“段基数+绝对偏移量”=“0+绝对偏移量”=“绝对偏移量”)。

当然,如何确定绝对偏移量取决于它在哪个部分以及该部分的开始位置;其中(取决于输出文件格式 - 平面二进制文件与目标文件)取决于org指令、节定义或链接器。


推荐阅读