Assembly 如何使用.intel\u语法指定标签引用?

Assembly 如何使用.intel\u语法指定标签引用?,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,在使用.intel_语法、使用-m32(即32位模式)编译某些x86指令时,我遇到了一些非常大的问题。如果我有这样的代码: #define STACK_SIZE 0x4000 .att_syntax movl $(stack + STACK_SIZE), %esp .comm stack, STACK_SIZE mov esp, offset stack + STACK_SIZE …一切都

在使用.intel_语法、使用-m32(即32位模式)编译某些x86指令时,我遇到了一些非常大的问题。如果我有这样的代码:

    #define STACK_SIZE                      0x4000

    .att_syntax
    movl    $(stack + STACK_SIZE), %esp

    .comm   stack, STACK_SIZE
    mov     esp, offset stack + STACK_SIZE
…一切都很好。此文件的反编译输出如下所示(首先是AT&T语法,然后是Intel语法)

但是,如果我像这样更改代码(我觉得“应该”工作):

…我得到了以下输出:

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模式的信息感觉有点稀疏;给出了一些提示,但没有什么真正的帮助

非常感谢。如果我有足够的声誉给你一笔赏金,我会。:)

找到了

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

    #define STACK_SIZE                      0x4000

    .att_syntax
    movl    $(stack + STACK_SIZE), %esp

    .comm   stack, STACK_SIZE
    mov     esp, offset stack + STACK_SIZE
这感觉很傻;我相信不会强迫我这么做。然而,我更喜欢在这个项目中使用GAS,以避免构建它所需的工具链。如果有人想进一步阐述这个问题(例如,确认或拒绝我的建议),请这样做,阅读您的想法也会很有趣


(埃戈尔·斯克里普托诺夫在上的评论让我明白了如何使用天然气来实现这一点。)

这似乎是对的。关于
.intel\u syntax
,没有太多信息,这是正确的。我写信给一个在源代码中找到名字的女孩,询问是否有任何文档。她回答说没有,她只是对他们从英特尔得到的一些东西进行了反向工程。我翻遍了源代码,发现
offset flat:
是必需的(当时)-冒号也是必需的!现在,只需简单的
偏移量
就可以了。。。而且可能还有更多可用的文档(?)


我认为Nasm将使用相同的工具链。。。没有?

谢谢!如你所见,我自己也发现了,但出于礼貌,我认为你的回答是正确的。:-)我现在不想使用NASM(即使我在10-15年前就已经这样做了)来减少我的项目的外部依赖性。(在很多情况下,它必须是一个交叉汇编程序,因为我的程序是一个很小的操作系统内核),但你是对的,在很多情况下,它可能比GAS(即使使用Intel语法)更好。