2010-08-25 52 views
30

我有以下的C++代碼什麼是C++和.LFE在彙編代碼中由GCC從C++程序生成的?

int factorial(int n){ 

    if(n==0){ 
     return 1; 
    } 
    return n*factorial(n-1); 

} 

int main(void){ 
    factorial(5); 
    return 0; 
} 

當我創建使用匯編文件的g ++ -S factorial.cpp我得到如下:

.file "tail_call_opt.cpp" 
    .text 
.globl _Z9factoriali 
    .type _Z9factoriali, @function 
_Z9factoriali: 
.LFB0: 
    .cfi_startproc 
    .cfi_personality 0x0,__gxx_personality_v0 
    pushl %ebp 
    .cfi_def_cfa_offset 8 
    movl %esp, %ebp 
    .cfi_offset 5, -8 
    .cfi_def_cfa_register 5 
    subl $24, %esp 
    cmpl $0, 8(%ebp) 
    jne .L2 
    movl $1, %eax 
    jmp .L3 
.L2: 
    movl 8(%ebp), %eax 
    subl $1, %eax 
    movl %eax, (%esp) 
    call _Z9factoriali 
    imull 8(%ebp), %eax 
.L3: 
    leave 
    ret 
    .cfi_endproc 
.LFE0: 
    .size _Z9factoriali, .-_Z9factoriali 
.globl main 
    .type main, @function 
main: 
.LFB1: 
    .cfi_startproc 
    .cfi_personality 0x0,__gxx_personality_v0 
    pushl %ebp 
    .cfi_def_cfa_offset 8 
    movl %esp, %ebp 
    .cfi_offset 5, -8 
    .cfi_def_cfa_register 5 
    andl $-16, %esp 
    subl $16, %esp 
    movl $5, (%esp) 
    call _Z9factoriali 
    movl $0, %eax 
    leave 
    ret 
    .cfi_endproc 
.LFE1: 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3" 
    .section .note.GNU-stack,"",@progbits 

我可以按照這個最,但什麼是.cfi和.LFE部分的用途? 我可以在哪裏瞭解更多關於gcc生成的程序集?

+0

[Gnu彙編程序(GAS)使用的CFI指令是什麼?](http://stackoverflow.com/questions/2529185/what-are-cfi-directives-in-gnu-assembler-gas-用於) – Andrey 2010-08-25 10:11:09

+3

這不是一個笨蛋。另一個問題不包括LFE。 – Puppy 2010-08-25 21:50:42

回答

48

這些指令告訴gas發出矮幀調用幀信息標籤,當幀指針丟失時,這些標籤顯然用於重建堆棧回溯。在你的情況下,幀指針是存在的,所以我想它可以用於在異常處理期間執行展開。這種機制的開銷比舊的sjlj(setjump/longjump)少。請參閱here,以及鏈接的Dwarf規範。

對於.Lxx標籤,.L前綴表示該標籤是本地文件,因此不會與其他文件中的同名標籤衝突。 GCC通常使用.L作爲自動生成的標籤。在這種情況下,最有可能的「FB」意味着「功能開始」,「FE」意味着「功能結束」。

+3

確實很好的描述。 – AbiusX 2011-05-30 13:34:34