文档详情

编译原理:第九章运行时存储空间组织祥解.ppt

发布:2017-08-23约1.41万字共77页下载文档
文本预览下载声明
嵌套过程语言的栈式实现 PASCAL 非局部名字的访问的实现 静态链和活动记录 嵌套层次显示表display 过程调用、过程进入、过程返回 参数个数 返回地址 形式单元 临时单元 内情向量 局部变量 老SP Display 表 全局Diaplay 1. 每个par Ti(i=1,2,…n)可直接翻译成如下指令: (i+4)[TOP]:= Ti (传值) (i+4)[TOP]:=addr(Ti ) (传地址) 过程调用、过程进入、过程返回 TOP? SP ? 调用过程的 活动记录 …… 形式单元 参数个数 返回地址 形式单元 临时单元 内情向量 局部变量 老SP Display 表 全局Diaplay 2. call P,n 被翻译成: 1[TOP]:=SP (保护现行SP) 3[TOP]:=SP+d (传送现行display地址) 4[TOP]:=n (传递参数个数) JSR (转子指令) 过程调用、过程进入、过程返回 TOP? SP ? 调用过程的 活动记录 …… 老SP 全局Diaplay 参数个数 3. 转进过程P后,首先定义新的SP和TOP,保存返回地址。 4. 根据全局display建立现行过程的display:从全局display表中自底向上地取l个单元,在添上进入P后新建立的SP值就构成了P的display。 参数个数 返回地址 形式单元 临时单元 内情向量 局部变量 老SP Display 表 全局Diaplay TOP? SP ? 调用过程的 活动记录 …… 返回地址 Display 表 5. 过程返回时,执行下述指令: TOP:=SP-1 SP:=0[SP] X:=2[TOP] UJ 0[X] 参数个数 返回地址 形式单元 临时单元 内情向量 局部变量 老SP Display 表 全局Diaplay TOP? SP ? 调用过程的 活动记录 …… TOP? SP ? 嵌套过程语言的栈式实现 PASCAL 非局部名字的访问的实现 静态链和活动记录 嵌套层次显示表display 过程调用、过程进入、过程返回 建立一个总的运行时的diaplay表(而不是每个过程的活动记录中都有一个),它记录正被调用执行的过程及其所有外层过程的活动记录的起始地址。通过这个diaplay访问数据。 在各过程活动记录之间保留一条静态链SL,它主要用于由层次大的过程调用层次小的过程后返回时,恢复调用前的display内容。(这时,调用返回后,执行一条UDIS指令) 三、上面两种方法的“折中”——PL编译程序(阅读资料) PL中每个过程的活动记录结构: 1) 简单局部变量 2) 连接数据 返回地址RA 动态链DL,指向过程调用者的活动记录起始地址 静态链SL, 指向过程的直接外层过程活动记录起始地址 静态链指针SL 形式单元 局部变量 数组 SP? 0 1 2 返回地址RA TOP? 动态链指针DL 3 program P; var x,y: integer; ... procedure P1; var i,j:integer; ... procedure P11(a,b:integer); ... begin ... end; begin ... call P11(i,j); ... end; procedure P2; var s,t:integer; ... procedure P21; begin ... end; begin ... call P1 ... end; begin ... call P2; ... end. 0 1 2 x 3 y 4 RA 5 SL(0) 6 DL(0) 7 s 8 t 9 0 1 5 2 主程序P ?过程 P2 ?过程 P1 ?过程 P11 Display P的活动记录 P2的活动记录 RA 10 SL(0) 11 DL(5) 12 i 13 j 14 10 2 P1的活动记录 RA 15 SL(10) 16 DL(10) 17 a 18 b 19 P11的活动记录 15 3 0 1 2 x 3 y 4 RA 5 SL(0) 6 DL(0) 7 s 8 t
显示全部
相似文档