3.7 过程
过程是软件中的一种很重要的抽象。它提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。
3.7.1 运行时栈
C语言使用栈数据结构提供的后进先出的内存管理原则。
3.7.2 转移控制
将控制从函数P
转移到函数Q
只需要简单地把程序计数器(PC
)设置为Q
的代码的起始位置。
call
指令有一个目标,即指明被调用过程起始的指令地址。
示例:
3.7.3 数据传送
过程调用还可能包括把数据作为参数传递,而从过程返回还有可能包括返回一个值。
超出6
个参数传递的例子:
3.7.4 栈上的局部存储
局部数据必须存放在内存中,常见的情况有:
1) 寄存器不足够存放所有的本地数据;
2) 对一个局部变量使用地址运算符’&‘
,因此必须能够为它产生一个地址;
3) 某些局部变量是数据或结构,因此必须能够通过数据或结构引用被访问到。
3.7.5 寄存器中的局部存储空间
寄存器是唯一被所有过程共享的资源。
据惯例,寄存器 %rbx
%rbp
和 %r12
~%r15
被划分为***被调用者保存寄存器***。所有其他的寄存器,除了栈指针 %rsp, 都分类为***调用者保存寄存器***。
示例:
3.7.6 递归过程
示例: