NASM。方括号return 相对位置。怎么找绝对?

NASM. Square brackets return relative location. How to find absolute?

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

mov al, [smb]
int 0x10

smb: db "X"

但事实证明,这显示了内存中的任意符号,而不是来自该位置的任意符号。好像是[]returns符号的相对地址。这可能是预料之中的,但问题是:如何找到绝对地址? 我正在使用 QEMU-i386,使用标准 NASM.

进行组装

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

您要查找的指令是Load Effective AddressWhat's the purpose of the LEA instruction?

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

这样的东西

对于16位和32位代码;绝对寻址是唯一的选择(忽略 "absolute address encoded as relative displacement" 的不必要的混淆,这种混淆发生在某些跳转和调用中,这对 mov al, [smb] 来说无关紧要)。

对于这两种情况(16 位和 32 位代码,以及 64 位代码); "absolute addressing" 实际上是相对于段基址的绝对偏移量。例如,mov al, [smb] 将隐式使用 DS 段,因此如果 DS 段的基地址不为零(这仅适用于 32 位和 16 位代码 - 对于 64 位code only FS and GS can have a segment base)实际的绝对地址将是"segment base + absolute offset"。如果段基数为零,则可以将其忽略 ("segment base + absolute offset" = "0 + absolute offset" = "absolute offset").

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