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