第10章-目标程序运行时的存储组织.pptVIP

  • 5
  • 0
  • 约8.4千字
  • 约 34页
  • 2020-05-13 发布于四川
  • 举报
第10章 目标程序运行时的组织 教学要求:本章介绍目标程序运行时的存储组织方式,包括静态存储分配和动态存储分配。 要求掌握各种存储组织形式的基本方法。 教学重点:静态分配策略和动态分配策略基本思想,嵌套过程语言栈式分配,活动记录、运行时栈的组织。 10.1 概述 2、存储分配策略: (1)静态存储分配——在编译阶段对源程序中的量分配固定单元,运行时始终不变。 注:1、程序结构特点:不允许递归调用,而且不含有可变数组。(如FORTRAN语言)。 2、基本策略:在编译时,根据各类数据所需的存储空间大小以及存储方式规定,在符号表中建立“名字-地址”对应关系,然后根据这些对应关系进行变量名的地址分配。 10.2 栈式存储分配的实现 一、简单的栈式存储分配的实现 程序结构特点:没有分程序结构,过程定义不嵌套,过程可递归调用。 简单栈式分配方案:把存储区组织成一个栈,运行时每进入一个过程,就把它的活动记录压入栈,形成过程工作时的临时数据区,该过程结束时取消该数据区。 二、嵌套过程语言的栈式分配的实现 1、程序结构特点:语言的定义允许嵌套,一个过程可以引用包围它的任一外层过程所定义的标识符(如变量,数组或过程等)(如PASCAL语言) 。 如何才能引用外层数据? 2、关键:设法跟踪每个外层过程的最新活动记录AR的位置。 跟踪办法: (1) 用静态链。 (2) 用DISPLAY表。 (1) 用静态链 在过程活动记录中增设静态链,指向包含该过程的直接外层过程的最新活动记录的起始位置。见P223-224 2、用Display表 Display表---嵌套层次显示表 当前激活过程的层次为K,它的Display表含有K+1个单元,依次存放着现行层,直接外层…直至最外层的每一过程的最新活动记录的基地址。 说明:1、由于过程的层数可以静态确定,因此每个过程的Display表的体积在编译时即可以确定。 2、某过程p是在层次为i的过程q内定义的,并且q是包围p的直接外层,那么p的过程层数为i+1。 用Display表的方案 (1)主程序---(2)P---(3)Q---(4)R 用Display表的方案 (1)主程序---(2)P---(3)Q---(4)R DISPLAY表的维护和建立 为便于组织存储区,将display作为活动记录的一部分,其相对地址在编译时是完全可以确定的。 假设过程P1可调用P2,为了能在P2中建立P2的display,在P1调用P2时设法把P1的display地址作为连接数据之一(全局display地址)传送给P2,因此连接数据包括: 老SP值(动态链) 返回地址 全局display地址 …… d DISPLAY 4 形式单元 3 参数个数 2 全局DISPLAY地址 1 返回地址 0 老SP 3、解决方法: (1)对每个过程或分程序都建立有自己的栈顶指示器TOP,代替原来仅有统一的栈顶指示器, 每个TOP的值保存在各自活动记录中。 (2)每个分程序享用包围它的那个最近过程的DISPLAY。每个分程序都隶属于某个确定的过程,分程序的层次是相对于它所属的那个过程进行编号的。 注:每个过程被当作是0层分程序。而过程体分程序(假定是一个分程序)当作是它所管辖的第1层分程序。 10.3 堆式存储分配 procedure swap(x,y:integer); var temp:integer; begin temp:=x; x:=y;y:=temp end; 调用swap(a,b)过程将不会影响a和b的值。 其结果等价于执行下列运算: x :=a; y :=b; temp :=x; x :=y; y :=temp; swap(x,y) int *x,*y; {int temp; temp=*x; *x=*y; *y=temp;} main( ) {int a=1,b=2; swap(a,b); printf(“a is now %d,b is now %d\n”,a,b);} 三、过程作为参数传递 program Main(input,output); procedure a(function x(m:integer):integer) begin writeln(x(5)); end{a} procedure

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档