如何使用 gcc 生成 Intel 语法的汇编代码?

发布于 2024-07-06 20:12:56 字数 89 浏览 8 评论 0原文

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

The gcc -S option will generate assembly code in AT&T syntax, is there a way to generate files in Intel syntax? Or is there a way to convert between the two?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

勿忘初心 2024-07-13 20:12:56

使用 -masm=intel

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

适用于 GCC、Clang 3.5 及更高版本。 GCC 手册

  • -masm=方言
    使用选定的方言输出 asm 指令。 支持的选择
    是 intel 或 att(默认)。 达尔文不支持英特尔。

对于 macOS,请注意,默认情况下,gcc 命令实际上运行 Clang,除非您安装了实际的 GCC(例如来自 Brew)。 现代 clang 支持 -masm=intel 作为其同义词,但这始终适用于 clang

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

请注意,直到 clang 14,这不会改变 clang 内联处理的方式asm() 语句,与 GCC 不同。

这些是 Matt Godbolt 的编译器资源管理器站点默认使用的选项:https://godbolt.org/
另请参阅 如何从 GCC/clang 程序集输出中删除“噪音” ? 获取有趣的 asm 输出的其他选项和技巧。

Use -masm=intel

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

That works with GCC, and Clang 3.5 and later. GCC manual:

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

For macOS, note that by default, the gcc command actually runs Clang unless you've installed actual GCC (e.g. from Brew). Modern clang supports -masm=intel as a synonym for this, but this always works with clang:

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

Note that until clang 14, this does not change how clang processes inline asm() statements, unlike for GCC.

These are the options used by Matt Godbolt's Compiler Explorer site by default: https://godbolt.org/
See also How to remove "noise" from GCC/clang assembly output? for other options and tips for getting asm output that's interesting to look at.

冬天的雪花 2024-07-13 20:12:56

gcc -S -masm=intel test.c

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

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

这可能会有所帮助。

The

gcc -S -masm=intel test.c

Does work with me. But i can tell another way, although this has nothing to do with running gcc.
Compile the executable or the object code file and then disassemble the object code in Intel asm syntax with objdump as below:

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

This might help.

糖果控 2024-07-13 20:12:56

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

就这样。

I have this code in CPP file:

#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;
 };

That's code worked with this GCC command line:

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

It will result *.exe file, and it worked in my experience.

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.

That's all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文