第六章运行时存储空间.pptVIP

  • 0
  • 0
  • 约3.73千字
  • 约 31页
  • 2018-11-29 发布于天津
  • 举报
第六章运行时存储空间

第六章 运行时存储空间 任课教师 王养廷 主要内容 活动记录 动态链 运行是变量的访问 1 活动记录 结构图 说明 目标代码区 静态区 库代码区 栈区 堆区 1 活动记录(续) 活动记录 过程的一个现场记录 作用 用来保存一个过程的执行现状 为什么使用活动记录 用来保存被中断的过程现场 活动记录的主要内容 过程控制信息 机器状态信息 全局变量信息 局部变量信息 1 活动记录(续) 过程控制信息 返回地址 指向前一个活动记录的指针 层数 长度 机器状态信息 寄存器状态 机器的状态 1 活动记录(续) 全局变量信息 全局变量 非局部变量 局部变量 形参变量 局部变量 临时变量 什么是临时变量 例如:S:=A*B+C*D+E 处理为:T1:=A*B;T2:=C*D;T3:=T1+T2;T4:=T3+E; 1 活动记录(续) 活动记录的结构 P216 SP指针的作用 指向当前的AR 用来计算新的AR的地址 AR的建立与撤销 在过程调用时创建AR 在过程返回时撤销AR 1 活动记录(续) 程序示例 procedure p(i:integer) var y:real; a:array[1..10] of integer; begin y:=a[1] * 25; end 1 活动记录(续) 活动记录示例 变量偏移地址 x:10 y:11 a:13 变量的访问? 2 动态链 动态链 每个AR保存前一个AR的地址,形成一个链 调用链 调用过程序列的过程名 表示方法(M, ... ,P, Q, R, S) 可以使用调用链来表示动态链 思考 对任意一个过程,其调用链不一定是唯一的 2 动态链(续) AR链 对应的调用链中的每个过程的AR被压入栈 形成一个AR链 每一条AR链为一个动态链 AR链示意图 2 动态链(续) 调用一个新过程Q,产生一个AR的过程 NewAR.DynaChainPointer:=sp; NewAR.Return:= ReturnAddr; NewAR.Level:= Level(Q); NewAR.Size:= Size(Q); NewAR.Machine:=(R1,R2..., Rn); sp:=sp+CurrentAR.Size; 转向Q子程序 2 动态链(续) 过程返回处理 (R1,R2,...Rn):=CurrentAR.Machine; Value:= CurrentReturnValue; sp:=CurrentAR.DynaChainPointer; 按照原来的CurrentReturn返回 活跃活动记录 记为:LiveAR(P),简记为:LAR(P) 非递归情况下 递归情况下 例如: (M, P1, P2 , Q1, R1, R2, R3) 活跃活动记录为:M, P2 , Q1 , R3 2 动态链(续) 动态链示例 procedure sort; procedure exch(i,j:integer); begin q(i,j); end; procedure q(m,n:integer); procedure part(y,z:integer); begin ... end; begin part(m,n);(1) q(m,n); (2) end; begin exch(1,8); end; 2 动态链(续) 动态链示例 画出程序的静态结构 画出程序执行到(1)和(2)点调用序列 画出程序执行到(1)和(2)点动态链 3 运行时变量访问(续) 程序中的变量 局部变量 保存在当前的AR中 全局变量 静态区(栈) 非局部变量 上一层或上几层的局部变量 如何能够访问到这些变量? 3 运行时变量访问(续) 示例程序 program main(input, output); var x:integer; procedure pro(); var y:real; procedure que(); var z:real; begin ... end begin ... end begin... end 3 运行时变量访问(续) 变量说明 对于过程Que; Z是局部变量 X是全局变量 Y是非局部变量 变量的访问 局部量:当前的AR中 全局量:静态区 非局部量:如何访问? 3 运行时变量访问(续) 过程声明链 声明链的定义 DeclaChain(Q)=(M, P, ... , Q); 对任意的Q,声明链是唯一的 变量Q的访问环境为: VarVisitEvn(Q)=[LAR(M), ... LAR(P),L

文档评论(0)

1亿VIP精品文档

相关文档