0

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

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

4

2 回答 2

1

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

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

于 2013-04-23T22:10:09.920 回答
0

找到了!

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

    mov     esp, offset stack + STACK_SIZE

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

(Egor Skriptunoff 在这个问题上的评论让我明白应该如何使用 GAS 来完成。)

于 2013-04-23T20:20:13.260 回答