如何使用 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 语法的汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Intel 语法中使用 clang 生成汇编代码?

我可以将 x86 程序集的 Intel 语法与 GCC 一起使用吗?

如何在没有扩展内联 asm 的情况下在 gcc 内联汇编中声明和初始化局部变量?

gcc/g++ 编译参数

读懂汇编代码

通过阅读 gcc 输出来学习汇编