目标代码生成器教材.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验报告 实验课名称:编译原理实验 实验名称:目标代码生成器实验 班级: 学号: 姓名: 时间:2016-4-30 一、问题描述 代码生成器着重考虑两个问题: 一是如何使生成的目标代码较短;另一个是如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数。这两个问题直接影响代码的执行速度。其中基本问题:所有代码生成器都要面对何种中间代码输入, (是逆波兰式,四元式,还是三元式?等问题)何种代码做为目标程序,选择适当的代码指令,最优的寄存器分配方案,和计算顺序等基本问提 二、数据结构设计 逆波兰式( 目标代码 ,采用堆栈。 char x1,x2; /* 从语义栈中弹出俩个操作数,用于判断与运算 */ x2=SEM.top(); /* SEM.top 记得后面要加(),否则没有值!!! */ coutx2endl; /* 用于调试用的,看栈是怎样变化的 */ SEM.pop(); x1=SEM.top(); coutx1endl; SEM.pop(); 三、算法设计 代码生成算法: 对每个四元式: i: A:=B op C,依次执行: 1. 以四元式: i: A:=B op C 为参数,调用函数过程GETREG(i: A:=B op C),返回一个寄存器R,用作存放A的寄存器。 2. 利用AVALUE[B]和AVALUE[C],确定B和C现行值的存放位置B’和C’。如果其现行值在寄存器中,则把寄存器取作B’和C’ 3. 如果B’≠R,则生成目标代码: LD R, B’ op R, C’ 否则生成目标代码 op R, C’ 如果B’或C’为R,则删除AVALUE[B]或AVALUE[C]中的R。 4. 令AVALUE[A]={R}, RVALUE[R]={A}。 5. 若B或C的现行值在基本块中不再被引用,也不是基本块出口之后的活跃变量,且其现行值在某寄存器Rk中,则删除RVALUE[Rk]中的B或C以及AVALUE[B]或AVALUE[C] 中的Rk ,使得该寄存器不再为B或C占用。 寄存器分配:GETREG(i: A:=B op C) 返回一个用来存放A的值的寄存器 (1) 如果B的现行值在某个寄存器Ri中,RVALUE[Ri]中只包含B,此外,或者B与A是同一个标识符,或者B的现行值在执行四元式A:=B op C之后不会再引用,则选取Ri为所需要的寄存器R,并转4; (2 ) 如果有尚未分配的寄存器,则从中选取一个Ri为所需要的寄存器R,并转4; (3 )从已分配的寄存器中选取一个Ri为所需要的寄存器R。最好使得Ri满足一下条件: 占用Ri的变量的值也同时存放在该变量的贮存单元中,或者在基本块中要在最远的将来才会引用到或不会引用到。 对RVALUE[Ri]中每一变量M,如果M不是A,或者如果M是A又是C,但不是B并且B也不在RVALUE[Ri]中,则 1) 如果AVALUE[M]不包含M,则生成 目标代码 ST Ri,M 2) 如果M是B,或者M是C但同时B也在RVALUE[Ri]中,则令AVALUE[M]={M, Ri} ,否则令AVALUE[M]={M} 3) 删除RVALUE[Ri]中的M (4) 给出R,返回。 中间代码 目标代码 RVALUE AVALUE T:=A-B LD R0,A R0含有T T在R0中 SUB R0,B U:=A-C LD R1,A R0含有T T在R0中 SUB R1,C R1含有U U在R1中 V:=T+U ADD R0,R1 R0含有V V在R0中 R1含有U U在R0中 D:=V+U ADD R0,R1 R0含有D D在R0中 图1.1 设计流程图 程序代码: #includeiostream /* 基本输入输出流 */ #includestack /* 运用栈,省去自己再写栈 */ #include ctype.h #includestdio.h #include cstdlib using namespace std; /*************************************** * 数据结构 * * 逆波兰式( 目标代码 * ***************************************/ /********************************************* * 目标代码指令:LD,ST,ADD,S

文档评论(0)

502992 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档