怎麼作到這一點? 編程
若是我想分析如何編譯某些內容,我將如何得到發出的彙編代碼? 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體系結構中,編譯器一般會在進行優化時將代碼轉換爲幾乎沒法識別。 看結果使人印象深入,使人着迷!