深入理解计算机系统 第三章 程序的机器级表示 part3
这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程”
这一节分为运行时栈、转移控制、数据传送、栈上的局部存储、寄存器中的局部存储空间和递归过程这 6 个小节
其中前 3 小节看懂了一部分内容,后面两个还没来得及看,下周看完补上
下面记录一下看懂的部分内容
首先,过程作为一种很重要的抽象(方法、函数都是过程),必然存在互相调用的情况,而过程调用有三个要点(以过程 P 调用过程 Q 为例):
传递控制:调用过程 Q 时,需将程序计数器指向 Q 的起始地址;调用结束之后,程序计数器需指向过程 P 调用 Q 指令之后的那条指令(该指令地址称为返回地址)
传递数据:P 向 Q 传递参数,Q 向 P 返回结果
分配和释放内存:Q 的执行可能需要新的内存空间,使用结束之后,需要将其释放
运行时栈
为函数分配的栈空间被称为栈帧,在调用的一开始,就会有定长的栈帧被分配,由于栈向下生长(栈顶的地址在整个栈空间中永远是最小的)。
所以,分配栈帧,在内存中的表现就是栈顶指针(%rsp)减小一个适当的量。
上面提到了,Q 在被调用时可能需要新的空间。
为什么是可能而不是一定呢?
因为当满足以下条件时,过程并不需要栈帧,只需要使用寄存器处理参数和局部变量即可,条件如下:
当所有的局部变量都可以保存在寄存器中,且该函数不会调用任何其他过程
转移控制
转移控制主要涉及 call 和 ret 这两条指令
call 指令将控制转移到一个过程的起始,主要做以下两件事:
跳转到目标过程的起始地址
将原过程中的返回地址压入栈中(放在原过程栈顶)
ret 指令弹出原过程栈顶的值,并跳转至对应的返回地址
数据传送
参数传递时,前 6 个参数会根据参数位置和数据大小选定对应的寄存器,规则如下表(来源于书):
如果参数的个数超过 6 个,那么超出的部分需要通过栈来传递(P 调用 Q 时,存储在 P 的栈帧中)