2016-02-26 61 views
1

我不明白爲什麼GCC甚至ESP觸及%,此代碼:它是一個堆棧框架嗎?

int foo(char *); 

int bar(char** a) 
{ 
    if (!a[1]) { 
     return 1; 
    } 

    if (foo(a[1]) == -1) { 
     return 1; 
    } 

    return 0; 
} 

-O2產生:

bar: 
.LFB0: 
     .cfi_startproc 
     movq 8(%rdi), %rdi 
     movl $1, %eax 
     testq %rdi, %rdi 
     je  .L7 
     subq $8, %rsp 
     .cfi_def_cfa_offset 16 
     call foo 
     cmpl $-1, %eax 
     sete %al 
     addq $8, %rsp 
     .cfi_def_cfa_offset 8 
     movzbl %al, %eax 
.L7: 
     rep ret 

而且鐺做一些事情,甚至瘋狂的開始和後來推%rax將其彈入%rdx

它是分配一個堆棧幀嗎?這與這些.cfi指令有關嗎?

+2

這是爲了對齊 – harold

回答

0

因爲在x64中,堆棧必須對齊16字節,並且調用指令使堆棧不平衡。這個特定的代碼沒有任何關心,但編譯器無法知道foo內的任何指令。

事實上,它總是在調用時未對齊,應該在序言代碼中重新排列;然而,優化器將序言和結語弄得面目全非。

+0

好吧,我在ftp://ftp.lip6.fr/pub/gcc/summit/2003/Porting%20gcc%20to%20the%20amd64.pdf§2.2 –

相關問題