- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[第十章目标代码生成
第十章 目标代码生成 目标代码生成概述 目标语言 四元式到目标指令的翻译 *寄存器分配 *临时变量地址分配 目标代码生成概述 目标代码生成器 主要任务: 将中间代码转换成等价的目标机指令(包括计算指令和管理AR的指令等),同时完成变量的地址分配,寄存器分配。 输入:中间代码/TokenList/AST+[符号表] 输出(多种形式可选): 绝对机器代码:执行速度快,缺乏灵活性 可重定位机器代码:可分模块编译,需连接和装入 汇编代码:生成的汇编代码还要经过汇编程序汇编才可运行 虚拟机的代码:增加可移植性,需要虚拟机的解释器 衡量目标代码质量的标准 在保证语义相等的情况下,生成的目标指令的条数越少和执行速度越快 一种目标机器语言 目标地址形式 假设: C是常量, R是寄存器, d是偏移量, A是绝对地址(内存地址) 表示方法: (R)代表R地址对应的内容; 立即式: #C ---- C是值 寄存器式: R ---- R本身就是一个地址; 变址式: d[R] ---- d+(R) , R的内容加上偏移d得到的地址 绝对式: A ---- A本身是一个地址值 间接寄存器: *R ---- (R), R的内容对应的地址 间接变址: *d[R] ---- (d+(R)), R的内容加上偏移d后得到的地址的内容; 从抽象地址到目标地址 (C语言) (0, off, dir) (0, off, indir) (1, off, dir) (1, off, indir) (-1, off, dir) (-1, off, indir) 一种目标机器语言 指令格式 (依赖于具体的目标机器),寄存器在最后(与教材不同) Op #C, R (立即-----寄存器) 含义是 C 与 (R)做op操作后,结果送到 R对应地址中; Op d[R1], R2 (存储器-----寄存器) 含义是 ((R1)+d) 和(R2)做op操作后,结果送到 R2对应地址中; Op R1, R2 (寄存器-----寄存器) 含义是 (R1) 和(R2)做op操作后,结果送到 R2对应地址中; Op A, R ( 绝对地址 ----- 寄存器) 含义是 (A) 和(R)做op操作后,结果送到 R对应地址中; 一种目标机器语言 基本指令集合 : Load Source, R ------从Source 读出送入R Store Target, R ------将R的内容送入Target Add Source, R ------R+Source结果 送入R Jmp(0/1), label ------- 跳转到label对应的地址 IN R ------- 输入值到R OUT R -------输出R的值 LEA A, R ------- A的地址送给R 从四元式生成目标代码 四元式种类 运算型: (OP, A, B , T) 赋值: (ASSIG, A, size, B) 跳转和标号(JUMP, -,-, L)和(LABEL, -,-, L) (WHILE,-,-,-),(THEN,t,-,-),(ELSE,-,-,-),…… 函数相关 (ENTRY, Lf, size, level) (ENDFUNC, _, _,_) 参数传递(VALACT/VARACT, X, offset, size) (CALL,Lf, true, t) (RETURN, -,-,t) 运算型目标代码生成 (OP,A, B,T)的代码生成算法要点(不考虑优化) 确定 A, B 和 T 的目标地址, 记为A.addr, B.addr和T.addr; 找到一个可用的寄存器R, 生成如下目标代码 例子 (ASSIG, A, size, B )的代码生成 size = 1算法要点: ①?求A和B的地址。 ②?申请寄存器RA, 生成(Load A.addr, RA)指令, ③生成指令(Store B.addr, RA); 例子 目标代码生成 四个寄存器 sp :保存当前AR的首地址; top:保存当前栈顶地址; gp:保存静态区的首地址; pc: 指令计数器; 存在问题 寄存器分配 寄存器分配应遵循的原则: 寄存器优先原则:即变量的值尽可能的存放在寄存器中 寄存器活跃原则:即变量的值至少有下一次的引用时才分配寄存器 寄存器多载原则:即一个寄存器中可能存放多个
文档评论(0)