第十二章代码生成 代码生成要考虑的主要问题 ·基本块的代码生成(在一个基本块范围内 考虑如何充分利用寄存器的问题) 从dag生成代码
第十二章 代码生成 • 代码生成要考虑的主要问题 • 基本块的代码生成(在一个基本块范围内 考虑如何充分利用寄存器的问题) • 从dag生成代码
代码生成要考虑的主要问题 具体细节依赖于目标机器和操作系统 共同的问题: 1.充分利用寄存器 基本块中 全局寄存器分配:不把寄存器平均分配给各个变量使 用,而是从可用的寄存器中分出几个,固定分配给几个变量单 独使用。标准—以各变量在循环内需要访问主存单元的次数 为标准。 2.选择计算机指令系统 3.选择计算次序
l 代码生成要考虑的主要问题 ——具体细节依赖于目标机器和操作系统 共同的问题: 1. 充分利用寄存器 基本块中 全局 寄存器分配:不把寄存器平均分配给各个变量使 用,而是从可用的寄存器中分出几个,固定分配给几个变量单 独使用。标准——以各变量在循环内需要访问主存单元的次数 为标准。 2. 选择计算机指令系统 3. 选择计算次序
目标代码的三种形式 地址代真的机器代码 待装配的机器代码模块 汇编语言(宏汇编) 机器指令形式 (op source destination ADD Sd∥d+s SUB sd d-s MOsd/s→d 机器指令开销(cost) MOVRM 开销2 ADd#1R 开销2 MOV RO,R1开销1
目标代码的三种形式 地址代真的机器代码 待装配的机器代码模块 汇编语言(宏汇编) 机器指令形式 (op source ,destination) ADD s,d // d+s SUB s,d //d-s MOV s,d //s d 机器指令开销 (cost) MOV R,M 开销 2 ADD #1 ,R 开销 2 MOV R0,R1 开销 1
目标机器的地址方式 地址方式汇编形式 地址 增加的开销 直接地址方式 寄存器方式 R R 0 间接寄存器方式*R contents(r) 0 索引方式 C(R) C+contentS(R) 间接索引方式*c(R)| ontents(c+content(R)
目标机器的地址方式 地址方式 汇编形式 地址 增加的开销 直接地址方式 M M 1 寄存器方式 R R 0 间接寄存器方式 *R contents(R) 0 索引方式 c(R) c+contents(R) 1 间接索引方式 *c(R) contents(c+contents(R)) 1
a: =b+c l. mo b R ADD C. R cost=6 MOV Roa 2. mov b a ADd C. a cost=6 假定R,R1和R2中分别存放了a,b和c的地址,采 用 3. MOV*RI, *Ro ADD Ro.R cost=2 假定R和R2中分别包含b和c的值,并且b的值在 这个赋值以后不再需要,则还可有 4. Add R,, RI MOVRIa cost=3
a:=b+c 1. MOV b, R0 ADD c, R0 cost=6 MOV R0 , a 2. MOV b, a ADD c, a cost=6 假定R0 , R1和R2中分别存放了a, b和c的地址, 采 用: 3. MOV *R1 , *R0 ADD *R2 , *R0 cost=2 假定R1和R2中分别包含b和c的值, 并且b的值在 这个赋值以后不再需要, 则还可有 4. ADD R2 , R1 MOV R1 , a cost=3