我在尝试使用 .intel_syntax 正确组装某些 x86 指令时遇到了一些非常大的问题,使用 -m32 编译(即 32 位模式)。如果我有这样的代码:
#define STACK_SIZE 0x4000
.att_syntax
movl $(stack + STACK_SIZE), %esp
.comm stack, STACK_SIZE
...一切皆好。反编译后的输出如下所示(首先是 AT&T 语法,然后是 Intel 语法)。
100010: bc 70 5a 10 00 mov $0x105a70,%esp
100010: bc 70 5a 10 00 mov esp,0x105a70
但是,如果我像这样更改我的代码(我觉得“应该”工作):
.intel_syntax noprefix
mov esp, stack + STACK_SIZE
...我得到了这个输出:
100010: 8b 25 70 5a 10 00 mov 0x105a70,%esp
100010: 8b 25 70 5a 10 00 mov esp,DWORD PTR ds:0x105a70
显然,这是错误的;我不是要取消引用堆栈标签,而是创建对它的引用。
目前,我的解决方法是对文件的某些部分使用 AT&T 语法,对其余部分使用 Intel 语法。这感觉就像一个杂牌。不幸的是,关于 GAS Intel 模式的信息感觉有点稀疏;此页面提供了一些提示,但没有任何帮助。
提前谢谢了。如果我有足够的声望给你赏金,我会的。:)