C++,ATT汇编
我有以下汇编代码:
push %ebp
mov %esp, %ebp
sub $0x28, %esp
(...)
Run Code Online (Sandbox Code Playgroud)
我的教科书声称通过从%esp中减去0x28(作为堆栈形成的一部分),12个字节被分配给变量.为什么从堆栈中减去十进制40分配12个字节?
这在堆栈上分配40个字节.但是,除了局部变量之外,还有它的用途,所以我的猜测是其余的用于未来函数调用的对齐和参数.
由于函数参数也在堆栈上传递,因此该函数想要传递给另一个函数的任何空间都需要空间.通过使用可以在执行调用时分配此空间push,但在函数开头分配一次空间并且mov稍后用于将数据放置到位是很常见的.如果你的函数对局部变量使用了12个字节,那么稍后将使用最多28个函数参数.
也可能有一点额外的分配用于对齐.除了Jerry提到的变量对齐之外,许多系统还希望堆栈指针与某个值对齐,因此如果要进行函数调用,则需要保留这些值.在32位系统上,这通常是8个字节,但在这种情况下也可能是16个字节.
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |