第10章节目标代码生成.pptVIP

  • 4
  • 0
  • 约1.29万字
  • 约 35页
  • 2017-04-01 发布于四川
  • 举报
第10章节目标代码生成

第十章 目标代码生成 目标代码生成概述 目标语言 四元式到目标指令的翻译 *寄存器分配 *临时变量地址分配 目标代码生成概述 目标代码生成器 主要任务: 将中间代码转换成等价的目标机指令(包括计算指令和管理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)

1亿VIP精品文档

相关文档