2010-05-24 116 views
5

下面粘貼的是未優化的GCC彙編輸出「int main(){}」。我對x86彙編相對來說比較好,但其中一些並不熟悉。是否有人可以對這裏發生的事情做一個逐行的介紹?x86 gcc彙編輸出幫助請

謝謝!

.text 
.globl _main 
_main: 
LFB2: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    leave 
    ret 
LFE2: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB2-. 
    .set L$set$2,LFE2-LFB2 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB2 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

回答

11

告訴鏈接把這個成可執行的.text部分:

.text 

出口main作爲外部符號:

.globl _main 

定義main函數本身:

_main: 
LFB2: 

保存前一幀指針:

pushq %rbp 
LCFI0: 

設置一個新的幀指針:

movq %rsp, %rbp 
LCFI1: 

恢復舊的幀指針,並返回到調用者:

leave 
    ret 

以下指令正在建立一個.eh_frame部,包含信息C++運行時需要用於異常處理。

LFE2: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 

這是普通的信息輸入表:

EH_frame1: 

它以一個長度從LSCIE1LECIE1標籤的差計算:

.set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 

(該.long.byte,.ascii.quad導致適當類型的值直接由第e彙編程序)。然後遵循CIE表本身:

LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 

另一個外部符號,這一個爲main功能的車架說明輸入(的異常處理信息還是部分):

.globl _main.eh 
_main.eh: 

再次,FDE開頭長度:

LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 

..並繼續與其餘的FDE表。

LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB2-. 
    .set L$set$2,LFE2-LFB2 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB2 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

這些異常處理表大多是無趣的,但如果你想知道然後在格式信息是available here

+0

奇怪的是,那裏有C++功能。我用gcc產生了輸出。 – kelf 2010-05-24 04:08:02

1

有幾行彙編語言。其他都是定義(所有以點(。)開頭的)都是內存分配,其他你可以在gcc文檔中輕鬆找到。

LFB2: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    leave 
    ret 

這是進入/退出堆棧幀。