2016-02-26 71 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 –

相关问题