如何使用gcc生成英特尔语法的汇编代码?

7vux5j2d  于 2023-03-18  发布在  其他
关注(0)|答案(4)|浏览(191)

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

pvabu6sv

pvabu6sv1#

使用-masm=intel

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

这适用于GCC和clang3.5及更高版本。GCC手册:

  • -masm=dialect

使用所选方言输出asm指令。支持的选项为intel或att(默认选项)。达尔文不支持intel。
对于Mac OSX,注意默认情况下,gcc命令实际上运行clang。现代clang支持-masm=intel作为其同义词,但this always works with clang

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

注意until clang 14,这并没有改变clang处理内联asm()语句unlike for GCC的方式。
以下是Matt Godbolt的编译器资源管理器站点默认使用的选项:https://godbolt.org/
另请参见How to remove "noise" from GCC/clang assembly output?,了解获取asm输出的其他选项和技巧,这些都很有趣。

flseospp

flseospp2#

gcc -S -masm=intel test.c

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

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

这可能会有帮助。

bjp0bcyl

bjp0bcyl3#

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

就这样。

q1qsirdb

q1qsirdb4#

我正在使用Ubuntu,下面的代码对我有效。

gcc -S -fgnu-tm <file.c>

相关问题