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


151

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


5
您可以使用llvm-mc在shell中轻松转换单个指令:echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelpacksswb -84(%bp,%si), %mm0
Janus Troelsen

Answers:


198

你有尝试过吗?

gcc -S -masm=intel test.c

未经测试,但我在这个论坛上找到了它,有人声称它为他们工作。

我只是在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 : //stackoverflow.com/a/11957826/950427


尽管文件名att2intel.sed不正确,该sed脚本却以另一种方式从Intel转换为ATT。
乔纳森·莱因哈特

有人为Mac提供解决方案吗?
2012年

Clang当前无法使用Intel语法。请参阅LLVM错误24232:[X86]内联汇编操作数不适用于.intel_syntax。另外,Clang会忽略prefix/ noprefix(不确定Clang是否使用程序集是否重要)。
jww 2015年

17

gcc -S -masm=intel test.c

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

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

这可能会有所帮助。


3
与objdump -d -M intel相同
David天宇Wong 2014年

5

我在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’
d33tah 2015年

在cygwin中工作。程序集以intel的形式进入,以intel的形式出现在.s文件中。如果使用-o a.out,则不会获得.s文件。
Orwellophile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.