首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么堆栈帧对齐为24个字节?

为什么堆栈帧对齐为24个字节?
EN

Stack Overflow用户
提问于 2022-02-17 08:40:52
回答 2查看 233关注 0票数 1

我正在阅读计算机系统:程序员的观点第三版,由兰德尔·E·布莱恩特和大卫·R·奥哈拉龙共同完成。

在第3章和第7.5节中,如图所示,堆栈帧是如何分配的:

我不明白为什么需要第4行和第12行。似乎这些行是不需要的,因为多余的8字节的堆栈内存根本不被使用。

正如注释所指出的,IMHO似乎不可避免地分配给堆栈帧对齐24个字节:

subq $8, %rsp

  • 分别为pushq %rbppushq %rbx分别增加了16字节和8字节

因此,我的问题可以概括为“为什么堆栈帧是对齐的24个字节?”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 5
EN

Stack Overflow用户

发布于 2022-02-17 09:29:52

24字节不是2的幂,因此不能是对齐。真正的对齐是16字节,您忘了计算call指令,还在堆栈上推送了8个字节。因此,堆栈指针总共移动32个字节,保持对齐为16个字节。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71154824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档