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

问题描述 投票:0回答:3

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

assembly gcc x86 intel-syntax
3个回答
237
投票

使用
-masm=intel

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

适用于

GCC
clang3.5
及更高版本。 GCC手册

  • -masm=dialect

    使用选定的方言输出 asm 指令。支持的选择 是 intel 或 att(默认)。达尔文不支持英特尔。

对于 Mac OSX,请注意,默认情况下,

gcc
命令实际上运行 clang。现代 clang 支持
-masm=intel
作为其同义词,但是 这始终适用于 clang:

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

请注意,直到 clang 14,这不会改变 clang 处理内联

asm()
语句的方式,与 GCC 不同

这些是 Matt Godbolt 的编译器资源管理器站点默认使用的选项:https://godbolt.org/
另请参阅如何从 GCC/clang 汇编输出中删除“噪音”?了解获取有趣的 asm 输出的其他选项和技巧。


22
投票

那个

gcc -S -masm=intel test.c

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

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

这可能会有所帮助。


6
投票

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

仅此而已。

© www.soinside.com 2019 - 2024. All rights reserved.