我正在阅读计算机系统:程序员的观点第三版,由兰德尔·E·布莱恩特和大卫·R·奥哈拉龙共同完成。
在第3章和第7.5节中,如图所示,堆栈帧是如何分配的:

我不明白为什么需要第4行和第12行。似乎这些行是不需要的,因为多余的8字节的堆栈内存根本不被使用。
正如注释所指出的,IMHO似乎不可避免地分配给堆栈帧对齐24个字节:
subq $8, %rsp和
pushq %rbp和pushq %rbx分别增加了16字节和8字节因此,我的问题可以概括为“为什么堆栈帧是对齐的24个字节?”
发布于 2022-02-17 09:30:27
这与x64 ABI (微软和SystemV)是一致的。在调用函数之前,堆栈必须对齐16个字节的边界(在您的示例中为“调用Q”)。让我们假设堆栈最初位于16字节的边界。当程序到达"P“标签(由于”调用P“指令)时,RSP在下面点8字节,因为”调用“将8减去RSP,并将RIP (8字节)保存在*RSP处。然后,有两个"pushq“(第2行和第3行),每一行减少RSP 8,因此RSP仍然不对齐。这就是编译器在执行第8行和第10行“调用Q”之前必须减去8来对齐RSP的原因。
本文很好地描述了x86/x64 ABI:https://en.wikipedia.org/wiki/X86_calling_conventions
发布于 2022-02-17 09:29:52
24字节不是2的幂,因此不能是对齐。真正的对齐是16字节,您忘了计算call指令,还在堆栈上推送了8个字节。因此,堆栈指针总共移动32个字节,保持对齐为16个字节。
https://stackoverflow.com/questions/71154824
复制相似问题