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

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

104820 次浏览

使用 -masm=intel

gcc -S -masm=intel -Og -fverbose-asm test.c

这种方法适用于海湾合作委员会,以及叮当3.5及更高版本。 海湾合作委员会手册:

  • -masm=dialect
    使用选择的方言输出指令。支持选择 是 Intel 还是 att (默认值)。达尔文不支持 Intel。

对于 MacOSX,请注意默认情况下,gcc命令实际上运行 clang。Modern clang 支持 -masm=intel作为这个的同义词,但是 这招对叮当总是管用:

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

请注意,直到叮当14,这确实 没有改变了 clang 处理内联 asm()语句的方式,不像海湾合作委员会

这些是 Matt Godbolt 的编译器浏览器站点默认使用的选项: https://godbolt.org/
另请参阅 如何消除“噪音”从海湾合作委员会/叮当组装输出?了解其他选项和获得有趣的高精度输出的技巧。

那个

gcc -S -masm=intel test.c

确实对我有用,但我可以告诉你另一种方法,虽然这和运行 gcc 没有任何关系。 编译可执行文件或目标代码文件,然后按照 Intelasm 语法使用 objecdump 反汇编目标代码,如下所示:

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

这个可能会有帮助。

我在 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.

仅此而已。