- 1、本文档共55页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 过程调用实现 简单过程调用 实在参数的计算和保存 控制转移、返回地址的保存 实在参数和形式参数的结合(多种结合方式) 局部变量的处理 返回值的处理 递归过程调用与过程参数 每层过程调用信息的保存与相应信息的查找 * * 活动记录中过程所用信息 用于表达式的计算 局部数据 寄存器、程序计数器(返回地址) 保存实在参数的值或地址 存放返回值 保存调用者活动记录地址等(SP) 用于存取嵌套外层过程中的非局部名(Display) 访问链 控制链 返回值 实在参数 机器状态 局部变量 临时变量 数组存储区 本 过 程 …… 所 辖 分 第 临时工作单元 程 一 序 层 局部数组说明 存 分 储 程 局部变量 区 序 分程序TOP 本过程Display 形式单元(m+1个) 连 主调分程序TOP 接 全局Display地址 数 返回地址 据 主调过程SP 本过程TOP * * 例子——函数的活动记录 int sub( i, p ) int i; char *p; { char buf[32]; buf[i] = *(p + i); return i + 1; } 临时变量: t1,t2,t3 局部变量:buf[32] 机器状态:R0, …, R9, SP, PC, PS 参数:i, p 返回值 控制链 Display * * 过程说明语句的翻译 分析参数的类型、分配地址 统计参数和返回值的空间需求 与调用语句配合完成形/实参数的结合 符号表处理 完成过程名的属性登记 说明语句: Procedure id(X1,X2,…,Xn) * * 过程说明语句代码结构 说明语句: Procedure id(X1,X2,…,Xn) 代码结构 X1.code 按参数传递要求实现参数X1的传递,或者完成传递准备; X2.code 按参数传递要求实现参数X2的传递,或者完成传递准备; …… Xn.code 按参数传递要求实现参数Xn的传递,或者完成传递准备; 完成动态存储分配相关的工作; 进入过程体 * * 过程调用语句的代码结构 过程调用语句id(E1,E2, … ,En) E1.code a1:=E1.place … En.code an:=En.place 动态存储分配相关工作 goto pc+n+1 param a1 … param an call id.place,n 需要一个队列存放a1, a2, …, an,以生成 * * 过程调用的实现 1. 在过程 f 中调用过程 p 时 a. 对实在参数求值,将结果存入 p 的活动记录参数域 b. 在 p 的活动记录中存放返回地址和当前栈顶指针 c. 按照活动记录的大小,上移栈顶指针 d. 控制转到 p 的入口(过程体) 临时变量 局部变量 机器状态 参数 返回值 控制链 Display * * 临时变量 局部变量 机器状态 参数 返回值 控制链 Display 过程调用的实现 2. 进入过程p并执行P a. 初值寄存器值和其它状态信息 b. 执行过程体 3. 从过程 p 返回(对应return语句) a. p 在返回值域中保存返回值 b. 恢复原栈顶指针和其它寄存器 c. 按返回地址返回调用者 * * 过程调用语句的制导翻译定义 产生式 语义规则 S → call id ( Elist ) { S.code := Elist.code ||gen(‘goto ‘pc+Elist.num+1)|| for 队列q中的每一项 t do gen(’param’ t ) || gen(‘call’ id.place’,’Elist.num) } Elist → E {Elist.num := 1; Elist.code := E.code || t:=newtemp; gen(t’:=’ E.place);建立队列q,并将t 放入q} Elist →Elist1,E {Elist.num := Elist 1.num+1; Elist.code := Elist 1.code || E.code || t:=newtemp; gen(t’:=’ E.place);将t 放入队列q} * * t1 := a * b t2 := 3 + t1 goto pc+3 param t2 param 6 call f, 2 函数调用 f(3+a*b,6)的翻译 * * 函数调用 f(b*c-1,x+y,x,
文档评论(0)