为什么.equ
指令不能以这种方式在气体中起作用:
.equ Mark64, 8(%rsi)
虽然它适用于此(注意:.text
部分,Mark32
所在的部分,在这种情况下设置为r / w):
Mark32 EQU DWORD PTR [ESI + 4]
如何让Mark64
在GAS中工作(.set
也不起作用)?
提前致谢!
答案 0 :(得分:1)
在某些汇编语言(例如MASM)中,equ
是文本替换。
但在GAS中,.equ
是一个数字常量,如MASM中的foo = 3
。对于文本替换,请使用C预处理器#define Mark64 8(%rsi)
。将文件命名为foo.S
,以便gcc在汇编之前通过CPP运行它。
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)