深入理解计算机系统 第三章 程序的机器级表示 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 的栈帧中)

 

posted @ 2018-11-18 22:57  stoneBlog  阅读(157)  评论(0编辑  收藏  举报