如何做到这一点呢?
如果我想分析某些东西是如何编译的,我该如何获得发出的程序集代码?
如何做到这一点呢?
如果我想分析某些东西是如何编译的,我该如何获得发出的程序集代码?
当前回答
这将生成C代码+行号交织的汇编代码,以便更容易地查看哪些行生成了什么代码(-S -fverbose-asm -g -O2):
# Create assembler code:
g++ -S -fverbose-asm -g -O2 test.cc -o test.s
# Create asm interlaced with source lines:
as -alhnd test.s > test.lst
在第3页(PDF的第15页)中找到了它。
其他回答
我在答案中没有看到这种可能性,可能是因为这个问题来自2008年,但在2018年,你可以使用马特·戈德博尔特的在线网站https://godbolt.org
你也可以在本地克隆git并运行他的项目https://github.com/mattgodbolt/compiler-explorer
下面是一个使用GCC的C语言解决方案:
gcc -S program.c && gcc program.c -o output
这里的第一部分将程序的程序集输出存储在与程序相同的文件名中,但是通过更改扩展名.s,您可以将其作为任何普通文本文件打开。 这里的第二部分编译您的程序以供实际使用,并为您的程序生成具有指定文件名的可执行文件。
上面使用的program.c是程序的名称,输出是要生成的可执行文件的名称。
正如每个人都指出的那样,对GCC使用-S选项。我还想补充一点,根据是否添加优化选项(-O0表示没有,-O2表示积极优化),结果可能会有所不同(很大程度上!)
特别是在RISC架构上,编译器在进行优化时经常会把代码转换得几乎认不出来。结果令人印象深刻,令人着迷!
就像大家说的,使用-S选项。
如果使用-save-temps选项,还可以获取预处理文件(.i)、程序集文件(.s)和目标文件(*.o)(分别使用-E、-S和-c来获取它们)。
使用-S开关:
g++ -S main.cpp
或者也可以用gcc:
gcc -S main.c
还有这个。