我想知道如何在我的C源文件上使用GCC来转储机器代码的助记符版本,这样我就可以看到我的代码被编译成什么。你可以用Java做到这一点,但我还没有找到一种方法与GCC。

我试图在汇编中重写一个C方法,看看GCC是如何做的,这将是一个很大的帮助。


当前回答

我还没有尝试gcc,但是对于g++,下面的命令对我来说是有效的。

-g用于调试构建 -Wa,-adhln被传递给汇编程序,用于与源代码一起列出

g++ -g -Wa,-adhln src.cpp

其他回答

使用-S(注意:大写S)切换到GCC,它将把程序集代码发送到扩展名为. S的文件中。例如,命令如下: gcc -O2 -S foo.c 将生成的程序集代码保留在文件foo.s上。

直接从http://www.delorie.com/djgpp/v2faq/faq8_20.html(但删除了错误的-c)

如果您给GCC提供-fverbose-asm标志,它就会

在生成的程序集代码中添加额外的注释信息,使其更具可读性。 […新增的评论包括: 编译器版本和命令行选项的信息, 与汇编指令相关联的源代码行,格式为FILENAME:LINENUMBER:CONTENT OF LINE, 提示哪些高级表达式对应于各种汇编指令操作数。

godbolt是一个非常有用的工具,他们的列表只有c++编译器,但你可以使用-x C标志,以便让它把代码视为C。它会为你的代码并排生成一个程序集列表,你可以使用Colourise选项生成彩色条,以直观地表明哪些源代码映射到生成的程序集。例如下面的代码:

#include <stdio.h>

void func()
{
  printf( "hello world\n" ) ;
}

使用以下命令行:

-x c -std=c99 -O3

和Colourise将生成以下内容:

你试过gcc -S -fverbose-asm -O source.c然后查看生成的源代码吗?S汇编文件?

生成的汇编程序代码进入源代码。S(你可以用-o assembly -filename重写它);-fverbose-asm选项要求编译器发出一些汇编注释“解释”生成的汇编代码。-O选项要求编译器优化一点(它可以用-O2或-O3优化更多)。

如果您想了解gcc在做什么,请尝试传递-fdump-tree-但要小心:您将得到数百个转储文件。

顺便说一句,GCC是可扩展的,可以通过插件或使用MELT(一种用于扩展GCC的高级领域特定语言;我在2017年放弃了它)

我还没有尝试gcc,但是对于g++,下面的命令对我来说是有效的。

-g用于调试构建 -Wa,-adhln被传递给汇编程序,用于与源代码一起列出

g++ -g -Wa,-adhln src.cpp