C++ 通过在函数调用中从%esp中减去来分配多少空间?
C++,ATT组件 我有以下汇编代码:C++ 通过在函数调用中从%esp中减去来分配多少空间?,c++,assembly,att,C++,Assembly,Att,C++,ATT组件 我有以下汇编代码: push %ebp mov %esp, %ebp sub $0x28, %esp (...) 我的教科书声称,通过从%esp中减去0x28(作为堆栈形成的一部分),可以为变量分配12个字节。为什么从堆栈中减去十进制40会分配12个字节?我怀疑你可能误读了你的书,但如果你没有误读,在我看来,这本书在这方面似乎大错特错了 从堆栈指针中减去40将分配40个字节。这可能并不总是准确无误的,但任何偏离它的地方通常都非常小 例如,如果在32位代码中分配一个8字节
push %ebp
mov %esp, %ebp
sub $0x28, %esp
(...)
我的教科书声称,通过从%esp中减去0x28(作为堆栈形成的一部分),可以为变量分配12个字节。为什么从堆栈中减去十进制40会分配12个字节?我怀疑你可能误读了你的书,但如果你没有误读,在我看来,这本书在这方面似乎大错特错了 从堆栈指针中减去40将分配40个字节。这可能并不总是准确无误的,但任何偏离它的地方通常都非常小
char
局部变量的函数通常仍会从堆栈指针中减去至少4,以腾出空间这将在堆栈上分配40个字节。但是,除了局部变量之外,它还有其他用途,所以我猜其余的用于对齐和将来函数调用的参数 由于函数参数也在堆栈上传递,因此需要为该函数要传递给另一个函数的任何参数留出空间。使用
push
执行调用时,可以分配此空间,但通常在函数开始时分配一次空间,然后使用mov
将数据放置到位。如果您的函数使用12个字节作为局部变量,那么以后将使用最多28个函数参数
还可以为对齐分配一点额外的资源。除了Jerry提到的变量对齐外,许多系统还希望堆栈指针与某个值对齐,因此如果要进行函数调用,则需要保留该值。在32位系统上,这通常是8字节,但在这种情况下也可能是16字节。此外,如果使用GCC,默认情况下,GCC也会尝试将堆栈与16字节边界对齐(另请参见:。我使用的是GCC。这很有意义-我所关心的变量是从%ebp偏移的。分配的其余部分必须用于将来的参数。Thx@Jerry这就是我的意思。书中的函数将调用另一个函数,所以它需要空间。我的编辑是否让它更清晰了?这个解释很有道理-我得到了一些信息用于所有的空间和仅有的几个变量。该空间用于参数。Thx