深入理解计算机系统 3-7 有一个例子不太明白,求解?

2021-11-30 23:56:31 +08:00
 xmpx310

P 函数的汇编码第 4 行,为什么需要申请 8 字节的栈帧空间,申请了也没用到啊?

2341 次点击
所在节点    C
8 条回复
xarthur
2021-11-30 23:59:39 +08:00
用来做内存对齐,提升效率用的。
StackOverflow 有类似的问题。
https://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack
xmpx310
2021-12-01 00:29:26 +08:00
@xarthur 内存地址已经是 16 的倍数了,-8 后反而只能地址只能对齐到 8 的倍数了?不太明白
xarthur
2021-12-01 01:11:46 +08:00
@xmpx310 根据这个 stackoverflow 上的解释。
https://stackoverflow.com/questions/49478020/an-assembly-code-in-book-csapp
因为 The 64 位 System V ABI 是按照 16 十六字节对齐的,在你 call 的时候会把 call 的返回地址压入栈,这个返回地址占 8 个字节,所以需要先预留 8 个字节用来做内存对齐。
xarthur
2021-12-01 01:18:05 +08:00
@xmpx310 我记得这种书里都是假设 stack 是从高位向地位增长的,所以这里 subq 其实是增加空间不是减少空间。
xarthur
2021-12-01 01:18:13 +08:00
*低位
secondwtq
2021-12-01 01:58:02 +08:00
最近正好在搞 stack frame 相关的东西,有点上头

你这个应该是因为你这个函数不是 leaf function ,还会 call 别的函数,AMD64 SysV ABI 要求 call 函数时 stack 必须 16-byte align 。

现在你知道调用 call P 时是 16-byte align 的,call 会 push 一个 RIP 进去,就变成了 8-byte align ,prologue 又 push 了俩 64-bit GPR ,还是 8-byte align ,L7 还要个 call ,想要 16-byte align 就得再 pad 8-byte 。
secondwtq
2021-12-01 02:05:36 +08:00
这是 alignment 要求不大于 16 bytes 的情况,有时会要求大于 16 bytes 的 alignment ,通常是有 local 有相关的要求。

这时由于编译器只能保证 stack 最开始 align 到 16 ,就会插一个 and 来实现。
secondwtq
2021-12-01 02:08:08 +08:00
另外至少 LLVM ,在个别情况下会借用 RBX 做一个特殊的 base pointer ,还没研究透 ...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX