- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第九章
3)数据对象空间分配 SP = TOP + 1 (定义新的SP) 1[SP] = 返回地址 (保护返回地址) TOP = TOP + L 定义新的TOP (L为过程P的活动记录所需的单元数,在处理说明语句时可以计算出来) 4)过程的返回(过程的活动记录出栈,同时恢复栈顶活动记录的TOP和SP) 如果有返回值(函数),将返回值传递到每个特定寄存器中。 TOP = SP – 1 SP = 0[SP] x = 2[TOP] UJ 0[x] (UJ为无条件转移语句,按x中的返回地址实行变址转移) * 本章教学线索 1 目标程序运行时的活动 2 运行时存储器的划分 3 静态存储分配 4 简单栈式存储分配 5 嵌套过程语言的栈式实现 5.1 嵌套过程语言非局部名字访问的实现 5.2 参数传递的实现 6 堆式动态存储 * 5 嵌套过程语言的栈式实现 语言要求:过程不仅允许递归调用,还允许过程进行嵌套定义。 存储分配的实现:采用栈式存储分配,对于运行时的局部名和形参完全可以采用简单栈式存储分配,由于允许过程嵌套定义,因此对非局部变量的访问需要单独处理,可以采用:静态链或显示表(Display)来实现。 嵌套层次:记录过程在定义时所在的层数。约定主程序的层数为0。如果过程P的直接外层Q的层数为i,则P的层数就为i+1。在实现时,采用一个计数器,遇到过程定义proc Begin时,计数器增加1,遇到过程结束proc end时,计数器减1。将过程的层数作为过程名的一个属性记录在符号表中。 * 5.1 嵌套过程语言非局部名字访问的实现 1)静态链和活动记录 在活动记录中增加一个域,存储指向直接外层的最新活动记录的地址,这样形成的链称为静态链。它表明过程定义时的嵌套关系。 活动记录中存储老SP形成的链称为动态链,它表明了过程活动时的调用关系。 活动记录的结构: 临时单元 内情向量 简单变量 形式单元 形参个数 静态链 返回地址 动态链(老SP) SP TOP 对于非局部变量的返回可以沿静态链进行访问。 * program P; var a,x integer; procedure Q(b:integer); var i:integer; procedure R(u:integer,v:integer); var c,d:integer; begin if u = 1 then R(u+1,v) v=(a+c)*(b-d); end {R} begin R(1,x); end {Q} procedure S; var c, i:integer ; begin a = 1; Q(c); end{S} begin a=0; S; end 0 1 1 2 24 d 23 c 22 v(形参) 21 u(形参) 20 2(形参个数) 19 11 18 返回地址 17 11 16 i 15 b(形参) 14 1(形参个数) 13 0 12 返回地址 11 5 10 i 9 c 8 0 7 0 6 返回地址 5 0 4 x 3 a 2 0 1 返回地址 0 0 P S Q R 过程Q调用R时活动记录情况 * 2)嵌套层次显示表和活动记录 在进入一个过程后,在建立其活动记录区的同时建立一张嵌套层次表display,该表给出了过程的嵌套关系,如果该过程的嵌套层次为i,则它的display表就包含i+1个单元(假设主过程的层次为0),display本身是一个栈。 由于过程的层数可以静态确定,因此每个过程的display表的体积在编译时可以确定,可以将display表作为活动记录的一部分,置于形式单元的上端。 例如:R的外层是Q,Q的外层是P,则R运行时display表的情况: R现行活动记录地址 Q的最新活动记录地址 P的活动记录地址 * 对于非局部变量的绝对地址就为: 绝对地址 = display[静态层次] + 相对地址 (非局部变量所在的静态层次可以在编译时处理说明语句时确定,可以记录在符号表中) 在活动记录中,display表的相对位置d是确定的,因此,在现行过程中引用了某一外层过程(k层)的变量x,可以用以下指令获取x的值: LD R1,(d+k)[SP] /*获取x所在的最新活动记录的SP值*/ LD R2,x
文档评论(0)