该gcc -S
选项将以 AT&T 语法生成汇编代码,有没有办法以 Intel 语法生成文件?或者有没有办法在两者之间转换?
hyperlogic
问问题
95275 次
3 回答
217
采用-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 的 Compiler Explorer 站点默认使用的选项:https
://godbolt.org/
另请参阅如何从 GCC/clang 程序集输出中删除“噪音”?获取有趣的 asm 输出的其他选项和技巧。
于 2008-10-14T04:36:30.997 回答
18
这
gcc -S -masm=intel test.c
和我一起工作。但我可以说另一种方式,尽管这与运行 gcc 无关。编译可执行文件或目标代码文件,然后使用 objdump 以 Intel asm 语法反汇编目标代码,如下所示:
objdump -d --disassembler-options=intel a.out
这可能会有所帮助。
于 2011-04-12T16:50:18.770 回答
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.
就这样。
于 2012-05-26T18:30:31.857 回答