我正在尝试使用.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语法。这感觉像一个kludge。不幸的是,有关GAS Intel模式的信息感觉有点稀疏; this page提供了一些提示,但没有任何真正帮助。
非常感谢提前。如果我有足够的声誉给你赏金,我愿意。 :)
答案 0 :(得分:1)
这似乎是正确的。你对.intel_syntax
没有太多信息是正确的。我写了一个我在源代码中找到的名字的gal,询问是否有任何文档。她回答说没有,她只是对他们从英特尔那里得到的东西进行逆向设计。我戳了一下源,发现需要offset flat:
(当时) - 冒号也是强制性的!现在,只是普通offset
似乎有效...而且可能还有更多文档可用(?)。
我应该认为Nasm会使用相同的工具链......不是吗?
答案 1 :(得分:0)
发现它!
我发现我必须写这样的代码:
mov esp, offset stack + STACK_SIZE
这感觉很傻;我相信NASM不会强迫我这样做。但是,我更喜欢在这个项目中使用GAS来避免构建它所需的工具链。如果有人想进一步详细阐述这个问题(例如确认或拒绝我的这个建议),请这样做,阅读你的想法也会很有趣。
(Egor Skriptunoff在this question的评论让我明白了如何用GAS完成这项工作。)