GAS组装中的EQU指令

时间:2017-01-29 01:48:11

标签: assembly gas

为什么.equ指令不能以这种方式在气体中起作用:

.equ Mark64, 8(%rsi)

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

Mark32 EQU DWORD PTR [ESI + 4]

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

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

NASM中的

equ也定义了一个数字汇编时常量,并使用%define进行文本替换。

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

答案 1 :(得分:-1)

数据部分:

MarksTable:
    .quad Mark64_1
    .quad Mark64_2
    .quad Mark64_3

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

然后我将MarksTable放入reg:

movq MarksTable, %rsi

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

callq   *0x8(%rsi)