代码之家  ›  专栏  ›  技术社区  ›  H3G3moKnight

堆栈上的两个神秘插槽(8字节)。下面的EBP寄存器值是多少?[副本]

  •  0
  • H3G3moKnight  · 技术社区  · 8 年前

    我一直在试图更深入地了解编译器如何生成机器代码,更具体地说,GCC如何处理堆栈。在这样做的过程中,我一直在编写简单的C程序,将它们编译成汇编程序,并尽力理解结果。下面是一个简单的程序及其生成的输出:

    asmtest.c :

    void main() {
        char buffer[5];
    }
    

    asmtest.s :

    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    leave
    ret
    

    令我不解的是为什么要为堆栈分配24个字节。我知道,由于处理器如何寻址内存,堆栈必须以4为增量分配,但如果是这种情况,我们应该只将堆栈指针移动8字节,而不是24字节。作为参考,一个17字节的缓冲区产生一个移动了40字节的堆栈指针,而没有缓冲区移动堆栈指针8。介于1到16字节之间的缓冲区 ESP 24字节。

    0 回复  |  直到 8 年前
        1
  •  49
  •   laalto    17 年前

    它是一个gcc特性,由 -mpreferred-stack-boundary=n 编译器试图使堆栈上的项与 2^n n 到 2 ,它只会在堆栈上分配8个字节。的默认值 不 4 i、 它将尝试与16字节的边界对齐。

    为什么会有“默认”8个字节,然后24=8+16个字节,是因为堆栈已经包含了8个字节 leave 和 ret

        2
  •  12
  •   stormsoul    17 年前

        3
  •  4
  •   Chris Arguin    17 年前

    我发现 this site

        5
  •  1
  •   Ringding    17 年前

    Mac OS X/Darwin x86 ABI需要16字节的堆栈对齐。在其他x86平台上,如Linux、Win32、FreeBSD等,情况并非如此。。。

        6
  •  -1
  •   brian sharon    17 年前

    推荐文章