通过从函数调用中的%esp中减去分配多少空间?

amo*_*luc 6 c++ assembly att

C++,ATT汇编

我有以下汇编代码:

push %ebp
mov  %esp, %ebp
sub $0x28, %esp
(...)
Run Code Online (Sandbox Code Playgroud)

我的教科书声称通过从%esp中减去0x28(作为堆栈形成的一部分),12个字节被分配给变量.为什么从堆栈中减去十进制40分配12个字节?

ugh*_*fhw 5

这在堆栈上分配40个字节.但是,除了局部变量之外,还有它的用途,所以我的猜测是其余的用于未来函数调用的对齐和参数.

由于函数参数也在堆栈上传递,因此该函数想要传递给另一个函数的任何空间都需要空间.通过使用可以在执行调用时分配此空间push,但在函数开头分配一次空间并且mov稍后用于将数据放置到位是很常见的.如果你的函数对局部变量使用了12个字节,那么稍后将使用最多28个函数参数.

也可能有一点额外的分配用于对齐.除了Jerry提到的变量对齐之外,许多系统还希望堆栈指针与某个值对齐,因此如果要进行函数调用,则需要保留这些值.在32位系统上,这通常是8个字节,但在这种情况下也可能是16个字节.