过程
运行时栈
首先看看运行时栈的布局:
解释一波:
- 当函数P调用Q的时候,首先为要为Q准备参数,6个参数的时候可以放在寄存器里,当多于6个参数的时候可以暂存在栈里。这里注意,实际Q的第七个参数是从rsp的位置开始往上加, para7=rsp+8, para8=rsp+16(注意,不管参数数据大小,都是8字节往上加,即使不够空着也不用), 这里的
参数构造区
就是Q函数的参数位置,图里的参数7是P的参数构造区,这里不要误会。 - 当执行call的时候,会把pc寄存器中的下一条的指令地址暂存在栈中,也就是上图中的
返回地址
,而ret就是把栈里值pop出去pc寄存器中。 - 如果Q中要用一些寄存器,但是这个寄存器被P占用了,这个时候需要把寄存器中的值暂存在
被保存的寄存器
<这个应该放在P桢中,是P的责任>,但是这里要注意了,图中的被保存寄存器是Q要调用其他函数时,提前把一些寄存器值存好,这个责任是调用者的责任,而不是被调用者的责任。 - 接下来函数Q中的局部变量有些需要放在栈上,1.放一些寄存器不足时的local数据 2.函数中&运算符的变量,毕竟需要拿到地址,不能放在寄存器 3.数组或者数据结构