P 函数的汇编码第 4 行,为什么需要申请 8 字节的栈帧空间,申请了也没用到啊?
1
xarthur 2021-11-30 23:59:39 +08:00 via iPhone 1
用来做内存对齐,提升效率用的。
StackOverflow 有类似的问题。 https://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack |
3
xarthur 2021-12-01 01:11:46 +08:00 via iPhone
@xmpx310 根据这个 stackoverflow 上的解释。
https://stackoverflow.com/questions/49478020/an-assembly-code-in-book-csapp 因为 The 64 位 System V ABI 是按照 16 十六字节对齐的,在你 call 的时候会把 call 的返回地址压入栈,这个返回地址占 8 个字节,所以需要先预留 8 个字节用来做内存对齐。 |
4
xarthur 2021-12-01 01:18:05 +08:00 via iPhone
@xmpx310 我记得这种书里都是假设 stack 是从高位向地位增长的,所以这里 subq 其实是增加空间不是减少空间。
|
5
xarthur 2021-12-01 01:18:13 +08:00 via iPhone
*低位
|
6
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 。 |
7
secondwtq 2021-12-01 02:05:36 +08:00
这是 alignment 要求不大于 16 bytes 的情况,有时会要求大于 16 bytes 的 alignment ,通常是有 local 有相关的要求。
这时由于编译器只能保证 stack 最开始 align 到 16 ,就会插一个 and 来实现。 |
8
secondwtq 2021-12-01 02:08:08 +08:00
另外至少 LLVM ,在个别情况下会借用 RBX 做一个特殊的 base pointer ,还没研究透 ...
|