
第10章(2)代码生成 n目标机器模型 n一个简单的代码生成器 n作业 2023/2/28 课程目绿☒m
2023/2/28 第10章 (2) 代码生成 n 目标机器模型 n 一个简单的代码生成器 n 作业 课程目录 1/11

代码生成概述p279 n逻辑阶段编译程序的最后一个阶段 n输入和输出中间代码 等价的目标代码 n目标代码的一般形式 u汇编语言代码 F优点:目标程序好读、可移植 F缺点:需经汇编器辅助代码生成 n代码生成器的设计环境 U要依赖于目标机器、指令系统和操作系统。 2023/2/28 国D21
2023/2/28 代码生成概述 p279 n 逻辑阶段 编译程序的最后一个阶段 n 输入和输出 中间代码 等价的目标代码 n 目标代码的一般形式 u 汇编语言代码 F 优点:目标程序好读、可移植 F 缺点:需经汇编器辅助代码生成 n 代码生成器的设计环境 u 要依赖于目标机器、指令系统和操作系统。 2/11

目标代码生成器的基本设计要求 n目标代码尽可能的短 n充分地发挥目标机可用资源效率 例如: u尽可能地使用执行速度快的指令 u充分利用寄存器和变址器,以节省访 问内存的时间 2023/2/28
2023/2/28 目标代码生成器的基本设计要求 n 目标代码尽可能的短 n 充分地发挥目标机可用资源效率 例如: u 尽可能地使用执行速度快的指令 u 充分利用寄存器和变址器,以节省访 问内存的时间 3/11

目标机模型 假想的计算机模型 p280 n常备指令 arc—源操作数 dst一目的操作数 指令形式 意义 举例 LD dst,arc (arc)☐dst LDR1,B(B)口R1取数 MOVE LD R1,#11 R ST arc,dst (arc)口dst STR1,B(R1)口B存数 ADD dst,arc (dst)+(arc)☐dst ADD R1,Ro(R)+(Ro)☐R SUB dst,arc (dst)-(arc)dst SUB R1,T1 (R1)-(T1)Ri MUL dst,arc (dst)米(arc)口dst MUL R1,D(R)*(D)☐R DIV dst,arc (dst)/(arc)dst DIV R1,A (Ri)/(A)R ●●●●●● ●●●●●● ●●●●●● 2023/2/28 国D4m
2023/2/28 目标机模型 假想的计算机模型 p280 n 常备指令 arc—源操作数 dst—目的操作数 指令形式 意 义 举 例 LD dst,arc (arc) dst LD R1,B (B) R1 取数 MOVE LD R1,#1 1 R1 ST arc,dst (arc) dst ST R1,B (R1) B 存数 ADD dst,arc (dst)+(arc) dst ADD R1,R0 (R1)+(R0) R1 SUB dst,arc (dst)-(arc) dst SUB R1,T1 (R1)-(T1) R1 MUL dst,arc (dst)*(arc) dst MUL R1,D (R1)*(D) R1 DIV dst,arc (dst)/(arc) dst DIV R1,A (R1)/(A) R1 . . . 4/11

一个简单的代码生成器 n算法策略 ù依次把每条中间代码变换成目标代码 ù在一个基本块范围内充分利用寄存器 n如何充分利用寄存器—做到 ù尽可能地让变量(存结果)的值保留在寄存器中 ù尽可能引用变量(操作数)在寄存器中的值,直到 该寄存器必须用来存放别的变量值或者已到达基本 块出口为止 n为了生成高效的目标代码,充分利用寄存器, 代码生成器需要了解如下信息 u哪些变量以后还会被引用 u变量的值当前在何处 一寄存器描述和地址描述 2023/2/28
2023/2/28 一个简单的代码生成器 n 算法策略 u 依次把每条中间代码变换成目标代码 u 在一个基本块范围内充分利用寄存器 n 如何充分利用寄存器——做到 u 尽可能地让变量(存结果)的值保留在寄存器中 u 尽可能引用变量(操作数)在寄存器中的值,直到 该寄存器必须用来存放别的变量值或者已到达基本 块出口为止 n 为了生成高效的目标代码,充分利用寄存器, 代码生成器需要了解如下信息 u 哪些变量以后还会被引用 u 变量的值当前在何处——寄存器描述和地址描述 5/11

目 三地址代码 目标代码 寄存器描述 地址描述 标 (1)T1:=A+B LD Ro,A 代 R空闲 ADD Ro,B Ro含T1 T1在R0 ②T2:=T1-C LD R1,Ro Ro含T1 Ro2 R1 T1在R, 生 R1空闲 SUB R1,C R1含T2均非空 T2在R1 成 (③)T3:=D+E ST Ro,Ti R0T1存入内存 T1在T1 Ro 举 LD Ro,D R含T2 T2在R1T2以后 T最远用到 ADD Ro,E Ro含T3 T3在RO 不用 例 (④T3:①2yT3R MUL R1,Ro R1含T3 I3在RT在T (⑤)T4:T3 LD Ro,T1 R1含T3 T3在R1T3以后 RoT存入Ro ADD Ro,R1 Ro含T4 T4在Ro 不用 (6)T5:=T3-ER1 SUB R1,E R1含T5R含T4 T5在R1T4在Ro (⑦)F:=T4*T5 MUL Ro,Ri T4以后 RoF存内存 ST Ro,F Ro含F F在RO,F 不用 假设只有Ro,R1两个寄存器可用,出口处只有F活跃 2023/2/28 D61
2023/2/28 目 标 代 码 生 成 举 例 三地址代码 (1)T1:=A+B (2)T2:=T1-C (3)T3:=D+E (4)T3:=T2*T3 (5)T4:=T1+T3 (6)T5:=T3-E (7)F:=T4*T5 目标代码 寄存器描述 地址描述 假设只有R0 ,R1两个寄存器可用 R0空闲 LD R0 ,A ADD R0 ,B R0含T1 T1在R0 R1空闲 LD R1 ,R0 SUB R1 ,C R0含T1 R1含T2 T1在R0 T2在R1 R0,R1 均非空 R0 T1最远用到 ST R0 ,T1 R0 T1存入内存 LD R0 ,D ADD R0 ,E R1含T2 R0含T3 T1在T1 T2在R1 T3在R0 T2以后 不用 R1 MUL R1 ,R0 R1含T3 T3在R1 T1在T1 R0 LD R0 ,T1 ADD R0 ,R1 R1含T3 R0含T4 T3在R1 T4在R0 R1 SUB R1 ,E R1含T5 R0含T4 T5在R1 T4在R0 T3以后 T1存入R0 不用 T4以后 R0 不用 MUL R0 ,R1 ,出口处只有F活跃 F存内存 ST R0,F R0含F F在R0,F 6/11

寄存器描述 p283 n寄存器描述 u目的动态地记录各寄存器分配信息 u内容描述每个寄存器当前的状况 F空闲已分配某个变量 已分配给某些变量 u数据结构 数组 Ro R1 R RVALUE 空闲 D,T1 n举例 u RVALUE[Ro]={}—寄存器R空闲 u RVALUE[R]={B}—R1中持有B的值 u RVALUE[R]={D,T}—R7中持有D,T的值 2023/2/28 ☒27m
2023/2/28 寄存器描述 p283 n 寄存器描述 u 目的 动态地记录各寄存器分配信息 u 内容 描述每个寄存器当前的状况 F 空闲 已分配某个变量 已分配给某些变量 u 数据结构 数组 RVALUE . R0 R1 . R7 n 举例 u RVALUE[R0]={ }——寄存器R0空闲 空闲 u RVALUE[R1]={B}——R1中持有B的值 B u RVALUE[R7]={D,T1}——R7中持有D,T1的值 D,T1 7/11

地址描述 p283 n地址描述 u目的动态地记录各变量现行值的存放位置 u内容描述每个变量现行值所在位置状况 F只在寄存器只在内存 同时在寄存器和内存 u数据结构数组 B C Tu AVALUE R1 R7,T1 n举例 u AVALUE[B]={R}—变量B的值在寄存器R1中 u AVALUE[C]={C一变量C的值在内存单元C中 u AVALUE[T]={R,T}一变量T的值在寄存器R7 和内存单元T中 2023/2/28 D81
2023/2/28 地址描述 p283 n 地址描述 u 目的 动态地记录各变量现行值的存放位置 u 内容 描述每个变量现行值所在位置状况 F 只在寄存器 只在内存 同时在寄存器和内存 u 数据结构 数组 AVALUE . B C . T1 n 举例 u AVALUE[B]={R1}——变量B的值在寄存器R1中 R1 u AVALUE[C]={C}——变量C的值在内存单元C中 C u AVALUE[T1]={R7,T1}——变量T1的值在寄存器R7 和内存单元T1中 R7,T1 8/11

目标代码简单生成算法使用举例 三地址代码 目标代码 寄存器描述 地址描述 (1)T:=A-B LD Ro,A RO空闲 SUB Ro,B R含T T在R, (②U:=A-C LD R1,A R含T Ro,R1 T在R,T以后 R1空闲 SUB R1,C R含U 均非空 U在R1 不用 (3)V:=T+U ADD Ro,R1 R1含U U在R1 V以后 RT不活跃 Ro含V V在RO 不用 (4)W:=V+U ADD Ro, Ro W存内存 ST Ro,W Ro含W W在Ro,W 假设只有Ro,R1两个寄存器可用,出口处只有W活跃 2023/2/28
2023/2/28 目标代码简单生成算法使用举例 三地址代码 (1)T:=A-B (2)U:=A-C (3)V:=T+U (4)W:=V+U 目标代码 寄存器描述 地址描述 假设只有R0 ,R1两个寄存器可用,出口处只有W活跃 R0空闲 LD R0 ,A SUB R0 ,B R0含T T在R0 R1空闲 LD R1 ,A SUB R1 ,C R0含T R1含U T在R0 U在R1 R0,R1 均非空 R0 T不活跃 ADD R0 , R1 R1含U R0含V U在R1 V在R0 T以后 不用 ADD R0 , R1 R0 W存内存 ST R0,W R0含W W在R0,W V以后 不用 9/11

目标代码简单生成算法课堂练习 例:赋值语句T4:=A+B-(E-(C+D)) BEGIN 三地址代码 且标代码 寄存器描述 地址描述 (1)T1:=A+B (1)LD Ro,A Ro空闲 (2)ADD Ro,B Ro含T1 T1在R0 2T2:=C+D (3)LD R1,C Ro含T1Ro,R1 T1在R0 R1空闲 (4)ADD R1,D R1含T2均非空 T2在R1 (③)T3=E2 (5)ST Ro,T1 T存入内在 Ro (6)LD Ro,E R1含T2 T2在R1T2以后 T1最远用到 (7)SUB Ro,R1 Ro含T3 T3在R 不用 ④T4:T (8)LD RL,T1 取T存入R 是否可优化? (9)SUB R1,Ro T4存入内存 10)STR1,T4 R1含T4 T4在R1,T4 假设只有R0,R1两个寄存器可用,出口处只有T4活跃 请给出目标代码及生成过程中寄存器和地址描述 2023/2/28 10/11
2023/2/28 目标代码简单生成算法课堂练习 三地址代码 (1)T1:=A+B (2)T2:=C+D (3)T3:=E-T2 (4)T4:=T1-T3 目标代码 寄存器描述 地址描述 假设只有R0 ,R1两个寄存器可用,出口处只有T4活跃 请给出目标代码及生成过程中寄存器和地址描述 R0空闲 (1)LD R0 ,A (2)ADD R0,B R0含T1 T1在R0 R1空闲 (3)LD R1 ,C (4)ADD R1,D R0含T1 R1含T2 T1在R0 T2在R1 R0,R1 均非空 R0 T1最远用到 (5)ST R0 ,T1 (6)LD R0 ,E (7)SUB R0,R1 R1含T2 R0含T3 T2在R1 T3在R0 T1存入内存 R1 (9)SUB R1,R0 (10)ST R1,T4 T4存入内存 R1含T4 T4在R1,T4 T2以后 不用 (8)LD R1 ,T1 取T1存入R1 例:赋值语句T4:=A+B-(E-(C+D)) 是否可优化? BEGIN 10/11