为什么海湾合作委员会生产ANDL $ -16?

mih*_*iho 2 x86 assembly 32-bit gnu-assembler disassembly

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

main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp   # ???
    subl    $48, %esp    # ???
    movl    $8, 16(%esp)        
    movl    $4, 20(%esp)
Run Code Online (Sandbox Code Playgroud)

为什么先减去16再减去48呢?这样做会不容易subl $64, %esp

sta*_*ify 6

andl    $-16, %esp   # ???
Run Code Online (Sandbox Code Playgroud)

上面的行不是从16减去16,esp而是其与16字节边界对齐.
而下一个是减去,主要是为了保留堆栈上的一些空间.

subl    $48, %esp    # ???
Run Code Online (Sandbox Code Playgroud)