关于栈中%rsp与返回地址是否占用全部8字节空间的技术咨询

有说法称栈会增长8字节,且%rsp会递减以为下一条指令调用的返回地址预留空间。
我的问题是:
该返回地址是否会占用全部8字节?即这8个存储位置是否都被返回地址占用?还是它并未占满提供的8字节空间,此时下一个要入栈的内容可以放在这8字节空间的剩余部分(返回地址未占用的位置)?
要搞清楚这个问题,得结合x86-64架构的特性和调用约定来说:
- 首先,x86-64架构下的指令指针
%rip是64位的,对应的返回地址自然也是8字节大小。所以当%rsp递减8字节预留返回地址空间时,这个返回地址会完全占满这8个字节,不存在剩余空间可以放其他内容。 - 从栈对齐规则来看,x86-64要求栈保持16字节对齐(除了
call指令执行后,此时栈上刚压入8字节的返回地址,%rsp会暂时处于不对齐状态,后续被调用函数会通过push操作或者调整栈指针来恢复对齐)。而返回地址作为64位的地址类数据,必须按8字节自然对齐存放,所以预留的这8字节空间刚好被它完全占据,没有多余位置。
举个实际执行的场景:当你执行call func指令时,CPU会自动完成两个原子性动作——先把%rsp减8,然后把当前%rip的下一条指令地址(也就是返回地址)写入到%rsp指向的新栈顶位置。整个8字节空间被返回地址填满,后续如果要入栈其他数据,只能继续递减%rsp来开辟新的栈空间,根本没法复用这8字节的剩余部分(因为本来就没有剩余)。
内容的提问来源于stack exchange,提问作者Luis Ong
相关产品推荐
相关产品推荐

