【问题标题】:How do you use gcc to generate assembly code in Intel syntax?如何使用 gcc 生成 Intel 语法的汇编代码?
【发布时间】:2010-09-17 00:43:54
【问题描述】:

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

【问题讨论】:

  • 您可以使用 llvm-mc 在 shell 中轻松转换单个指令:echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intel 提供 packsswb -84(%bp,%si), %mm0

标签: gcc x86 gnu intel assembly


【解决方案1】:

你试过了吗?

gcc -S -masm=intel test.c

未经测试,但我在 forum 中找到了它,有人声称它对他们有用。

我刚刚在 mac 上尝试过,但失败了,所以我查看了我的手册页:

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

它可能适用于您的平台。

对于 Mac OSX:

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

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

【讨论】:

  • 尽管文件名 att2intel.sed 不正确,但 sed 脚本会以另一种方式从 Intel 转换为 ATT。
  • 谁有 Mac 的解决方案?
  • Clang 目前无法使用 Intel 语法。见LLVM Bug 24232: [X86] Inline assembly operands don't work with .intel_syntax。此外,Clang 会忽略 prefix/noprefix(不确定 Clang 是否使用程序集是否重要)。
  • gcc -S -masm=intel test.c 也适用于 MacOS
【解决方案2】:

gcc -S -masm=intel test.c

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

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

这可能会有所帮助。

【讨论】:

  • 同objdump -d -M intel
【解决方案3】:

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

就是这样。

【讨论】:

  • 不适用于我的 Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
  • 在 cygwin 中工作。程序集以 intel 形式输入,在 .s 文件中以 intel 形式输出。如果您使用-o a.out,您将不会获得 .s 文件。
  • 这是一种使用内联汇编的错误方式,并且会在启用优化后中断。您在 asm 语句中修改 eaxa 而不告诉编译器。有关指南,请参阅stackoverflow.com/tags/inline-assembly/info-masm=intel 是使语法 inside asm 模板工作的正确选项,但是使用 Basic asm 而不是 Extended with constraints 是非常错误的。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
相关资源
最近更新 更多