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

hyp*_*gic 144 x86 assembly gcc gnu intel

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

Jas*_*git 187

你试过这个吗?

gcc -S -masm=intel test.c
Run Code Online (Sandbox Code Playgroud)

未经测试,但我在这个有人声称它适合他们的论坛中找到了它.

我只是在Mac上尝试了这个并且它失败了,所以我查看了我的手册页:

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.
Run Code Online (Sandbox Code Playgroud)

它可能适用于您的平台.

对于Mac OSX:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp
Run Code Online (Sandbox Code Playgroud)

资料来源:https://stackoverflow.com/a/11957826/950427


pho*_*xis 16

gcc -S -masm=intel test.c
Run Code Online (Sandbox Code Playgroud)

和我合作.但我可以告诉另一种方式,虽然这与运行gcc无关.编译可执行文件或目标代码文件,然后用objdump反汇编Intel asm语法中的目标代码,如下所示:

 objdump -d --disassembler-options=intel a.out
Run Code Online (Sandbox Code Playgroud)

这可能有所帮助.

  • 与objdump -d -M intel相同 (3认同)

小智 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;
 };
Run Code Online (Sandbox Code Playgroud)

该代码适用于此GCC命令行:

gcc.exe File.cpp -masm=intel -mconsole -o File.exe
Run Code Online (Sandbox Code Playgroud)

它将产生*.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.
Run Code Online (Sandbox Code Playgroud)

就这样.

  • 这是使用内联汇编的一种损坏的方式,并且在启用优化的情况下会损坏。您可以在 asm 语句中修改“eax”和“a”,而无需告诉编译器。请参阅 https://stackoverflow.com/tags/inline- assembly/info 获取指南。`-masm=intel` 是使 asm 模板内部的语法正常工作的正确选项,但使用 Basic asm 而不是带有约束的 Extended asm 是非常错误的。 (3认同)