如何使用 .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 函数来添加逗号?