你如何在gcc中從C / C ++源得到彙編程序輸出?

怎麼作到這一點? 編程

若是我想分析如何編譯某些內容,我將如何得到發出的彙編代碼? sass


#1樓

使用-S開關 優化

g++ -S main.cpp

或者與gcc this

gcc -S main.c

也看到這個 spa


#2樓

使用-S選項: 調試

gcc -S program.c

#3樓

若是你想看到的東西取決於輸出的連接,那麼除了前面提到的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的輸出上。 對象


#4樓

使用-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得到的詳細程度的一些指示。


#5樓

正如你們所指出的那樣,對GCC使用-S選項。 我還想補充說,結果可能會有所不一樣(很是!)取決於您是否添加優化選項( -O0表示無, -O2表示激進優化)。

特別是在RISC體系結構中,編譯器一般會在進行優化時將代碼轉換爲幾乎沒法識別。 看結果使人印象深入,使人着迷!

相關文章
相關標籤/搜索