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
定义为一个有意义的名称可能会很好。
为什么 .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 运行 它。
equ
还定义了一个数字 assemble-time 常量,并使用 %define
进行文本替换。
顺便说一句,将 Mark64 定义为 8(%rsi)
似乎是一个糟糕/令人困惑的想法。人们不希望看起来像符号名称的东西实际上包含寄存器引用。不过,将数字魔术常量 8
定义为一个有意义的名称可能会很好。