Tan's Blog.

CSAPP过程的实现

字数统计: 875阅读时长: 2 min
2019/05/13 Share

计算机系统学习

今天学习了过程的控制,过程是软件中的一种抽象,可以在程序中的某个地方调用某个过程来实现某种功能。

栈帧的结构

栈帧在过程中必不可少,如果我们要想搞清楚过程的实现,就必须先知道栈帧的结构是如何构成的。栈帧其实可以认为是程序栈的一段,而程序栈又是存储器的一段,因此栈帧说到底还是存储器的一段。

这幅图可以表示栈帧的结构,它由一系列栈帧构成,这些栈帧每一个都对应一个过程,而且每一个帧指针+4的位置都存储着函数的返回地址,每一个帧指针指向的存储器位置当中都备份着调用者的帧指针。

过程的实现

总的来说,过程实现当中,参数传递以及局部变量内存的分配和释放都是通过栈帧来实现的,大部分情况下,我们认为过程调用当中做了以下几个操作。
1、备份原来的帧指针,调整当前的帧指针到栈指针的位置
2、建立起来的栈帧就是为被调用者准备的,当被调用者使用栈帧时,需要给临时变量分配预留内存
3、备份被调用者保存的寄存器当中的值,如果有值的话,备份的方式就是压入栈顶。
4、使用建立好的栈帧,比如读取和写入,一般使用mov,push以及pop指令等等。
5、恢复被调用者寄存器当中的值,这一过程其实是从栈帧中将备份的值再恢复到寄存器,不过此时这些值可能已经不在栈顶了。因此在恢复时,大多数会使用pop指令,但也并非一定如此。
6、释放被调用者的栈帧,释放就意味着将栈指针加大,而具体的做法一般是直接将栈指针指向帧指针。
7、恢复调用者的栈帧,恢复其实就是调整栈帧两端,使得当前栈帧的区域又回到了原始的位置。
8、弹出返回地址,跳出当前过程,继续执行调用者的代码。此时会将栈顶的返回地址弹出到PC,然后程序将按照弹出的返回地址继续执行。这个过程一般使用ret指令完成。
过程的实现大概就是以上八个步骤组成的,不过这些步骤并不都是必须的,有的时候,开启编译器的优化会优化掉很多步骤。

总结

过程在平时的程序中扮演着很重要的角色,基本上一些功能稍微复杂一点的程序都需要用到过程。过程可以帮助隐藏掉一些很复杂的实现步骤,甚至有一些过程可以直接提供API接口,只需要连接上接口就可以实现该过程的功能,同时这也在开发过程中帮助开发人员省了不少力气。通过本节的学习,我基本了解在汇编语言中,在调用过程时寄存器和程序内存会发生的变化,同时这也更好的帮助我理解寄存器的内部结构情况。

CATALOG
  1. 1. 计算机系统学习
    1. 1.1. 栈帧的结构
    2. 1.2. 过程的实现
    3. 1.3. 总结