深入理解计算机操作系统——第3章:程序编码,过程调用(程序栈)

3.1 linux采用平坦寻址的方式,及程序员将整个存储空间看做一个大的字节数组

3.2 程序编码

程序需要经过:

     预处理器 :将#include还有#define宏进行处理(扩展)

     编译器: 产生源代码的汇编代码code.s 

     汇编器:  目标代码(是机器码的一种形式),包含所有的指令的二进制形式,只是还没有填入地址全局值

     链接器:将所有目标代码文件与所需库文件代码合并,最终得到可执行目标文件

机器级程序使用的存储地址是虚拟地址,机器代码只是将存储器看做一个很大的,按字节寻址的数组。

3.7 过程:

过程含义

(1)一个过程的调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另外一部分。

(2)必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。

这些都是通过程序栈来实现的:

 

(1)机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储

(2)为单个过程分配的那部分栈称为“栈帧“。

 程序的调用过程

P:

(1)假设过程P(调用者)调用过程Q(被调用者),则Q的参数放在P的栈帧中。

(2)当P调用Q时,P的返回地址压入栈中,形成P的栈帧末尾。

       返回地址:当程序从Q返回应该继续执行的地方。

Q:

(3)Q的栈帧从保存的帧指针的值开始(如上图的%ebp)

(4)这个帧指针开始后面保存的其他寄存器的值,如:局部变量等

原文地址:https://www.cnblogs.com/yanliang12138/p/4708358.html