2012年6月8日 星期五

檢查GCC編譯後的組合語言

參考網址
GCC - Passing Options to the Assembler
GNU Assembler - Command-Line Options

通常我們在用gcc時, 是直接把.c/.cpp檔案轉換成.o檔的
中間其實還有一個步驟 --- 轉換成assembly, 也就是真正的compile動作, 被gcc藏起來了

然而若要進行程式最佳化的校調, 把assembly拉出來看是免不了的

這時可以在gcc的參數加上:
-Wa,-a
就會在螢幕上輸出assembly的結果

我自己是習慣使用:
-g -Wa,-adhl
這樣就會有C source code / assembly 的對照

底下舉一個簡單的例子, 建立一個test.c檔:

int func (int a)
{
    return a + 1;
}


送進gcc compile (x86):
gcc -Wall -g -Wa,-adhl -c -o test.o test.c
便會輸出:

   1                .file "test.c"
   2                .section .debug_abbrev,"dr"
   3               Ldebug_abbrev0:
   4                .section .debug_info,"dr"
   5               Ldebug_info0:
   6                .section .debug_line,"dr"
   7               Ldebug_line0:
   8 0000 32000000   .text
   8      02001D00 
   8      00000101 
   8      FB0E0D00 
   8      01010101 
   9               Ltext0:
  10               .globl _func
  11                .def _func; .scl 2; .type 32; .endef
  12               _func:
  13               LFB0:
  14                .file 1 "test.c"
   1:test.c        **** int func (int a)
   2:test.c        **** {
  15                .loc 1 2 0
  16 0000 55         pushl %ebp
  17               LCFI0:
  18 0001 89E5       movl %esp, %ebp
  19               LCFI1:
   3:test.c        ****   return a+1;
  20                .loc 1 3 0
  21 0003 8B4508     movl 8(%ebp), %eax
  22 0006 40         incl %eax
   4:test.c        **** }...
  23                .loc 1 4 0
  24 0007 C9         leave
  25               LCFI2:
  26 0008 C3         ret
  27               LFE0:
  ...

底下是一些debug symbol, 可以不用管它
當然裡面的重點就是func()的assembly, 你可以很清楚地看到x86的stack操作, +1運算, 以及call return等動作

除了方便校調程式以外, 對學習compiler / assembly 也有很大的幫助

沒有留言:

張貼留言