GAS 汇编中的 EQU 指令

EQU directive in GAS assembly

为什么 .equ 指令不能以这种方式在 gas 中工作:

.equ Mark64, 8(%rsi)

虽然它在此工作(注意:Mark32 所在的 .text 部分在这种情况下设置为 r/w):

Mark32 EQU DWORD PTR [ESI + 4]

如何让 Mark64 在 GAS 中工作(.set 也不起作用)?

提前致谢!

数据部分:

MarksTable:
    .quad Mark64_1
    .quad Mark64_2
    .quad Mark64_3

其中 Mark64_x 只是代码部分中的一个标签。

然后我刚刚将 MarksTable 放入了 reg:

movq MarksTable, %rsi

毕竟我可以像这样从 rsi 访问 Mark64_2

callq   *0x8(%rsi)

在某些汇编语言中(例如 MASM)equ 是文本替换。

但是在 GAS 中,.equ 是一个数值常数,就像在 MASM 中的 foo = 3。对于文本替换,请使用 C 预处理器 #define Mark64 8(%rsi)。将文件命名为 foo.S,这样 gcc 将在汇编前通过 CPP 运行 它。

NASM 中的

equ 还定义了一个数字 assemble-time 常量,并使用 %define 进行文本替换。


顺便说一句,将 Mark64 定义为 8(%rsi) 似乎是一个糟糕/令人困惑的想法。人们不希望看起来像符号名称的东西实际上包含寄存器引用。不过,将数字魔术常量 8 定义为一个有意义的名称可能会很好。