C ++,ATT程序集
我有以下汇编代码:
push %ebp
mov %esp, %ebp
sub $0x28, %esp
(...)
我的教科书声称通过从%esp中减去0x28(作为堆栈形成的一部分),为变量分配了12个字节。为什么从堆栈中减去十进制40会分配12个字节?
答案 0 :(得分:5)
这在堆栈上分配40个字节。但是,除了局部变量之外,还有它的用途,所以我的猜测是其余的用于未来函数调用的对齐和参数。
由于函数参数也在堆栈上传递,因此该函数想要传递给另一个函数的任何空间都需要空间。使用push
执行调用时可以分配此空间,但在函数开头分配一次空间并且稍后使用mov
将数据放置到位是很常见的。如果你的函数对局部变量使用了12个字节,那么最多可以留下28个函数参数供以后使用。
还可以为协调分配一点点额外费用。除了Jerry提到的变量对齐之外,许多系统还希望堆栈指针与某个值对齐,因此如果要进行函数调用,则需要保留这些值。在32位系统上,这通常是8个字节,但在这种情况下也可能是16个。
答案 1 :(得分:3)
我怀疑你可能误读了你的书,但如果你没有,那对我来说看起来很不错,好像这本书是错误的。
从堆栈指针中减去40分配40个字节。这可能总是正确 1 ,但任何与它的偏差通常都会非常小。
char
局部变量的函数通常仍会从堆栈指针中减去至少4个腾出空间。