C++ 为什么要在函数调用上填充堆栈?
我在查看函数调用的分解时发现:C++ 为什么要在函数调用上填充堆栈?,c++,macos,assembly,C++,Macos,Assembly,我在查看函数调用的分解时发现: movq %rsp, %rbp pushq %rbx subq $136, %rsp ; Pad the stack .... addq $136, %rsp ; Unpad the stack popq %rbx popq %rbp ret 这样做的价值是什么?这是局部变量的空间,而不是填充 编译器将为运行此函数时必须存储的任何寄存器溢出和局部变量创建堆栈空间 在使用SysV ABI分解x86-64
movq %rsp, %rbp
pushq %rbx
subq $136, %rsp ; Pad the stack
....
addq $136, %rsp ; Unpad the stack
popq %rbx
popq %rbp
ret
这样做的价值是什么?这是局部变量的空间,而不是填充 编译器将为运行此函数时必须存储的任何寄存器溢出和局部变量创建堆栈空间 在使用SysV ABI分解x86-64代码时,您可能会看到一些填充(大多数不是Windows的东西,我不知道在后者中是如何实现的),因为函数调用必须使堆栈以16字节对齐。但在这种情况下,它实际上是为局部变量保留空间
您可能想查看或查找有关编译器如何工作的更多信息。在适当的内存地址边界上更快地访问(与任何填充一样)。哦,通过偏移量访问内存比通过执行
push
es访问内存更快?我想他们是在为具有函数范围的局部变量保留空间。之后,您必须将堆栈指针放置在正确的位置,以避免干扰堆栈帧(返回到程序中的正确位置)。这还将防止小的缓冲区溢出损坏返回地址和保存的帧指针,从而使调试更加容易。