如何使用 gcc 生成 Intel 语法的汇编代码?
Posted
技术标签:
【中文标题】如何使用 gcc 生成 Intel 语法的汇编代码?【英文标题】:How do you use gcc to generate assembly code in Intel syntax? 【发布时间】: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
【参考方案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://***.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 语句中修改 eax
和 a
而不告诉编译器。有关指南,请参阅***.com/tags/inline-assembly/info。 -masm=intel
是使语法 inside asm 模板工作的正确选项,但是使用 Basic asm 而不是 Extended with constraints 是非常错误的。以上是关于如何使用 gcc 生成 Intel 语法的汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章
我可以将 x86 程序集的 Intel 语法与 GCC 一起使用吗?