Assembly 为什么GCC生产ANDL$-16?

Assembly 为什么GCC生产ANDL$-16?,assembly,x86,32-bit,disassembly,gnu-assembler,Assembly,X86,32 Bit,Disassembly,Gnu Assembler,我需要一些帮助来理解GCC为什么这么做 main: pushl %ebp movl %esp, %ebp andl $-16, %esp # ??? subl $48, %esp # ??? movl $8, 16(%esp) movl $4, 20(%esp) 为什么先减去16,然后再减去48?这样做不是更容易吗 andl $-16, %esp # ??? 以上行不是从es

我需要一些帮助来理解GCC为什么这么做

main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp   # ???
    subl    $48, %esp    # ???
    movl    $8, 16(%esp)        
    movl    $4, 20(%esp)
为什么先减去16,然后再减去48?这样做不是更容易吗

andl    $-16, %esp   # ???
以上行不是从
esp
中减去16,而是将其与16字节边界对齐。
而接下来的一个是减法,主要是为了在堆栈上保留一些空间

subl    $48, %esp    # ???

这是
而不是
添加
,哦,我的上帝。现在我明白了。谢谢为什么它要将它与16个字节对齐?它是32位,而不是64位,abi不要求这样做,我认为您可以通过设置-mprefered stack boundary=2(这将使堆栈对齐到4字节,除非需要更大的对齐)@Marco“为什么它会将其对齐到16字节?”这是因为
-mprefered stack boundary
的默认值是4。与架构无关,正如您所指出的,ABI没有对其进行详细说明。我认为它是为SIMD指令系列的优化而设置的。这是什么意思“将它与16字节边界对齐”,我查了一下MPD堆栈边界,它看起来像是要设置帧大小,但我不认为是这样,因为它是subl的16@SteveG
这是什么意思“将其与16字节边界对齐”
因为它当时是subl的16
:我不知道你所说的
subl的16