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

时间:2013-02-13 05:20:18

标签: c++ assembly att

C ++,ATT程序集

我有以下汇编代码:

push %ebp
mov  %esp, %ebp
sub $0x28, %esp
(...)

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

我怀疑你可能误读了你的书,但如果你没有,那对我来说看起来很不错,好像这本书是错误的。

从堆栈指针中减去40分配40个字节。这可能总是正确 1 ,但任何与它的偏差通常都会非常小。


  1. 例如,如果在32位代码中分配一个8字节的对象,它可以分配一些额外的空间(总共12个字节),这样可以确保8字节对象具有8字节对齐。同样,在32位代码中,您通常只能以(至少)32位增量调整堆栈指针,因此具有一个char局部变量的函数通常仍会从堆栈指针中减去至少4个腾出空间。