如何使用.intel_syntax指定标签引用?

时间:2013-04-23 20:10:54

标签: assembly x86 gas

我正在尝试使用.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提供了一些提示,但没有任何真正帮助。

非常感谢提前。如果我有足够的声誉给你赏金,我愿意。 :)

2 个答案:

答案 0 :(得分:1)

这似乎是正确的。你对.intel_syntax没有太多信息是正确的。我写了一个我在源代码中找到的名字的gal,询问是否有任何文档。她回答说没有,她只是对他们从英特尔那里得到的东西进行逆向设计。我戳了一下源,发现需要offset flat:(当时) - 冒号也是强制性的!现在,只是普通offset似乎有效...而且可能还有更多文档可用(?)。

我应该认为Nasm会使用相同的工具链......不是吗?

答案 1 :(得分:0)

发现它!

我发现我必须写这样的代码:

    mov     esp, offset stack + STACK_SIZE

这感觉很傻;我相信NASM不会强迫我这样做。但是,我更喜欢在这个项目中使用GAS来避免构建它所需的工具链。如果有人想进一步详细阐述这个问题(例如确认或拒绝我的这个建议),请这样做,阅读你的想法也会很有趣。

(Egor Skriptunoff在this question的评论让我明白了如何用GAS完成这项工作。)