第八章代码生成
本章内容
一个简单的代码生成算法
涉及存储管理,指令选择,寄存器分配和计算次序选择等基本问题
前端
代码
优化
器
中间
代码
源程序
代码
生成
器
中间
代码
目标
程序
代码生成器的设计中的问题
目标程序
可执行目标模块
可重定位目标模块
允许程序模块分别编译
调用其它先前编译好的程序模块
汇编语言程序
免去编译器重复汇编器的工作
从教学角度,增加可读性
代码生成器的设计中的问题
指令的选择
目标机器指令系统的性质决定了指令选择的难易程度,指令系统的统一性和完备性是重要的因素
指令的速度和机器特点是另一些重要的因素
代码生成器的设计中的问题
若不考虑目标程序的效率,指令的选择是直截了当的。
三地址语句x := y + z(x,y和z都是静态分配)
MOV y, R0 /* 把y装入寄存器R0 */
ADD z, R0 /* z加到R0上*/
MOV R0, x /* 把R0存入x中*/
逐个语句地产生代码,常常得到低质量的代码
代码生成器的设计中的问题
语句序列 a := b + c
d := a + e
的代码如下
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0
ADD e, R0
MOV R0, d
代码生成器的设计中的问题
语句序列 a := b + c
d := a + e
的代码如下
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0 -- 多余的指令
ADD e, R0
MOV R0, d
代码生成器的设计中的问题
语句序列 a := b + c
d := a + e
的代码如下
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0 -- 多余的指令
ADD e, R0 -- 若a不再使用,第三条也
MOV R0, d -- 多余
代码生成器的设计中的问题
寄存器分配
运算对象处于寄存器中的指令通常比运算对象处于内存的指令要短一些,执行也快一些
寄存器分配
选择驻留在寄存器中的一组变量
寄存器指派
挑选变量要驻留的具体寄存器
代码生成器的设计中的问题
计算次序的选择
某种计算次序可能会比其它次序需要较少的寄存器来保存中间结果
目标机器
目标机器的指令系统
选择可作为几种微机代表的寄存器机器
四字节组成一个字,有n个通用寄存器R0,R1, …,Rn-1。
二地址指令 op 源,目的
MOV {源传到目的}
ADD {源加到目的}
SUB {目的减去源}
第八章 代 码 生 成 来自淘豆网www.taodocs.com转载请标明出处.