如何使用 gcc 生成 Intel 语法的汇编代码?

Posted

技术标签:

【中文标题】如何使用 gcc 生成 Intel 语法的汇编代码?【英文标题】:How do you use gcc to generate assembly code in Intel syntax? 【发布时间】:2010-09-17 00:43:54 【问题描述】:

gcc -S 选项将生成 AT&T 语法的汇编代码,有没有办法以 Intel 语法生成文件?或者有没有办法在两者之间转换?

【问题讨论】:

您可以使用 llvm-mc 在 shell 中轻松转换单个指令:echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intel 提供 packsswb -84(%bp,%si), %mm0 【参考方案1】:

你试过了吗?

gcc -S -masm=intel test.c

未经测试,但我在 forum 中找到了它,有人声称它对他们有用。

我刚刚在 mac 上尝试过,但失败了,所以我查看了我的手册页:

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.

它可能适用于您的平台。

对于 Mac OSX:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

来源:https://***.com/a/11957826/950427

【讨论】:

尽管文件名 att2intel.sed 不正确,但 sed 脚本会以另一种方式从 Intel 转换为 ATT。 谁有 Mac 的解决方案? Clang 目前无法使用 Intel 语法。见LLVM Bug 24232: [X86] Inline assembly operands don't work with .intel_syntax。此外,Clang 会忽略 prefix/noprefix(不确定 Clang 是否使用程序集是否重要)。 gcc -S -masm=intel test.c 也适用于 MacOS【参考方案2】:

gcc -S -masm=intel test.c

对我有用。但我可以说另一种方式,尽管这与运行 gcc 无关。 编译可执行文件或目标代码文件,然后使用 objdump 以 Intel asm 语法反汇编目标代码,如下所示:

 objdump -d --disassembler-options=intel a.out

这可能会有所帮助。

【讨论】:

同objdump -d -M intel【参考方案3】:

我在 CPP 文件中有这段代码:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int a = 0;
int main(int argc, char *argv[]) 
    asm("mov eax, 0xFF");
    asm("mov _a, eax");
    printf("Result of a = %d\n", a);
    getch();
    return 0;
 ;

这是与这个 GCC 命令行一起使用的代码:

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

它会生成 *.exe 文件,根据我的经验,它可以工作。

Notes:
immediate operand must be use _variable in global variabel, not local variable.
example: mov _nLength, eax NOT mov $nLength, eax or mov nLength, eax

A number in hexadecimal format must use at&t syntax, cannot use intel syntax.
example: mov eax, 0xFF -> TRUE, mov eax, 0FFh -> FALSE.

就是这样。

【讨论】:

不适用于我的 Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’ 在 cygwin 中工作。程序集以 intel 形式输入,在 .s 文件中以 intel 形式输出。如果您使用-o a.out,您将不会获得 .s 文件。 这是一种使用内联汇编的错误方式,并且会在启用优化后中断。您在 asm 语句中修改 eaxa 而不告诉编译器。有关指南,请参阅***.com/tags/inline-assembly/info。 -masm=intel 是使语法 inside asm 模板工作的正确选项,但是使用 Basic asm 而不是 Extended with constraints 是非常错误的。

以上是关于如何使用 gcc 生成 Intel 语法的汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章