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

Posted

技术标签:

【中文标题】如何使用 .intel_syntax 指定标签引用?【英文标题】:How do you specify a label reference using .intel_syntax? 【发布时间】:2013-04-23 20:10:53 【问题描述】:

我在尝试使用 .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 模式的信息感觉有点稀疏; this page 给出了一些提示,但没有任何帮助。

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

【问题讨论】:

【参考方案1】:

这似乎是正确的。你是对的,.intel_syntax 上没有太多信息。我写信给我在源代码中找到的一个女孩,询问是否有任何文档。她回答说没有,她只是对他们从英特尔那里得到的一些东西进行了逆向工程。我浏览了源代码,发现offset flat: 是必需的(当时)——冒号也是强制性的!现在,简单的offset 似乎可以工作......而且可能还有更多可用的文档(?)。

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

【讨论】:

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

找到了!

原来我必须这样写代码:

    mov     esp, offset stack + STACK_SIZE

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

(Egor Skriptunoff 在this question 的评论让我明白了应该如何使用 GAS。)

【讨论】:

以上是关于如何使用 .intel_syntax 指定标签引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何指定引用的多目标项目的平台?

如何引用 div 标签的 Javascript 函数来添加逗号?

如何链接外部CSS样式表

JQuery js如何判断标签指定属性是不是存在

在 GridSearchCV 中使用精度作为评分时如何指定正标签

如何使用CSS设置标签的背景小图标 简单