怎么作到这一点? 编程
若是我想分析如何编译某些内容,我将如何得到发出的汇编代码? sass
使用-S开关 优化
g++ -S main.cpp
或者与gcc this
gcc -S main.c
也看到这个 spa
使用-S选项: 调试
gcc -S program.c
若是你想看到的东西取决于输出的连接,那么除了前面提到的gcc -S以外,对输出目标文件/可执行文件的objdump也多是有用的。 这是Loren Merritt的一个很是有用的脚本,它将默认的objdump语法转换为更易读的nasm语法: code
#!/usr/bin/perl -w $ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR '; $reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])'; open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die; $prev = ""; while(<FH>){ if(/$ptr/o) { s/$ptr(\[[^\[\]]+\],$reg)/$2/o or s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or s/$ptr/lc $1/oe; } if($prev =~ /\t(repz )?ret / and $_ =~ /\tnop |\txchg *ax,ax$/) { # drop this line } else { print $prev; $prev = $_; } } print $prev; close FH;
我怀疑这也能够用在gcc -S的输出上。 对象
使用-S
选项gcc(或g ++)。 资源
gcc -S helloworld.c
这将在helloworld.c上运行预处理器(cpp),执行初始编译,而后在运行汇编程序以前中止。 get
默认状况下,这将输出一个文件helloworld.s
。 仍然可使用-o
选项设置输出文件。
gcc -S -o my_asm_output.s helloworld.c
固然,只有拥有原始资源才能使用。 若是只有结果对象文件,则另外一种方法是使用objdump
,方法是设置--disassemble
选项(或缩写形式的-d
)。
objdump -S --disassemble helloworld > helloworld.dump
若是为目标文件启用了调试选项(编译时为-g
)而且文件还没有被剥离,则此选项最有效。
运行file helloworld
将为您提供有关使用objdump得到的详细程度的一些指示。
正如你们所指出的那样,对GCC使用-S
选项。 我还想补充说,结果可能会有所不一样(很是!)取决于您是否添加优化选项( -O0
表示无, -O2
表示激进优化)。
特别是在RISC体系结构中,编译器一般会在进行优化时将代码转换为几乎没法识别。 看结果使人印象深入,使人着迷!