编译原理第十一章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020年8月13日8时12分
11.3 一个简单的代码生成器 假设高级语言的语句为
A:=(B+C)*D+E 把它翻译为中间代码为
T1:=B+C T2:=T1*D A:=T2+E
2020年8月13日8时12分
假设临时变量T1 和 T2出了基本块将不会被引用,目标代 码翻译为:
LD R, B
ADD R, C
(1)代码生成器的输入 代码生成器的输入包括源程序的中间表示以及符号表中的 信息。 (2)目标程序目标程序形式:绝对机器代码、可重定位的机 器语言、汇编语言。本章采用汇编代码作为目标语言。
2020年8月13日8时12分
(3)指令选择
指令集的一致性和完全性是重要因素,生成的代码的质量 取决于它的速度和大小。
ADD R1,R0
RVALUE R0包含T
R0包含T R0包含U R0包含V R1包含U R0包含W
AVALUE T在R0中
T在R0中 U在R1中 U在R1中 V在R0中 W在R0中
2020年8月13日8时12分
11.4 寄存器分配
由于寄存器速度快,在生成目标代码时,尽可能把各变量 的现行值保存在寄存器中,把基本块不再引用的变量所占 用的寄存器及早释放出来。为此,引用指令执行代价概念: 每条指令的执行代价=每条指令访问主存单元次数+1。
编译原理
主讲教师:雷向东
2020年8月13日8时12分
第十一章 目标代码生成 代码生成是把语义分析后或优化后的中间代码变换成目标 代码。目标代码一般有以下三种形式。 (1)能够立即执行的机器语言代码。 (2)待装配的机器语言模块。当需要执行时,由连接装入程 序把它们和某些运行程序连接起来,转换成能执行的机器 语言代码。 (3)汇编语言代码,需经过汇编程序汇编,转换成可执行的 机器语言代码。
T1:=A+B
T2:=C+D
T3:=E-T2
T4:=T1-T3 假设R0和R1是两个可使用的寄存器。T4是基本块出口之 后的活跃变量。
2020年8月13日8时12分
G的 目标代码:
LD ADD LD ADD ST LD SUB LD SUB ST
R0, A R0, B R1, C R1, D R0, T1 R0, E R0, R1 R1, T1 R1, R0 R1, T4
寄存器型
op Ri, Rj
(Ri) op (Rj)→Ri
变址型
op Ri, c(Rj)
间接型
2020年8月13日8时12分
op Ri, *M op Ri, *Rj op Ri, *c(Rj)
(Ri) op ((Rj)+c)→Ri
(Ri) op ((M))→Ri (Ri) op ((Rj))→Ri (Ri) op (((Rj)+c))→Ri
(4)寄存器分配 由于指令对寄存器的操作常常要比对存储 单元的操作块且指令短,因此,如何充分利用计算机的寄 存器,对于生成好的代码是非常重要的。寄存器的使用可 以分成两个子问题:
(a) 在寄存器分配期间,为程序的某一点选择驻留在寄 存器中的一组变量;
(b) 在随后的寄存器指派阶段,挑出变量将要驻留的具体 寄存器。 2020年8月13日8时12分
例如: op Ri, Rj
执行代价为 1
op Ri, M
执行代价为 2
op Ri, *Rj
执行代价为 2
op Ri, *M
执行代价为 3
2020年8月13日8时12分
11.5 DAG的目标代码 为了生成更有效的目标代码, 要考虑的另一个问题是, 对基本块中中间代码序列。 例11.4 考察下面基本块的中间代码序列G
MUL R, D
ADD R, E
ST
R, A
2020年8月13日8时12分
ห้องสมุดไป่ตู้
待用信息 如果在一个基本块中,中间代码 i 对A定值,中间代码 j要 引用A值,而从 i 到 j 之间没有A的其它定值,称 j 引用了 中间代码 i 中所计算的A的值。
寄存器描述和地址描述 使用寄存器描述数组RVALUE:描述每个寄存器当前的状 况。建立变量地址描述数组AVALUE记录变量的存放情况。
2020年8月13日8时12分
代码生成要考虑的主要问题: (1)如何使生成的目标代码较短 (2)如何充分利用计算机的寄存器,减少目标中代码访问访 问主存单元的次数。
2020年8月13日8时12分
11.1 基本问题 代码生成器的设计细节要依赖于目标语言和操作系统,诸 如内存管理、寄存器分配等方面是所有代码生成器要考虑 的问题。现讨论设计代码生成器时一般问题。
2020年8月13日8时12分
例11.1 考察基本块 T:=A-B U:=A-C V:=T+U W:=V+U
假设W 是基本块出口的活跃变量,只有R0和 R1是可用的 寄存器。
2020年8月13日8时12分
中间代码 T: =A-B U: =A-C V: = T+U W: =V+U
目标代码 LD R0, A SUB R0, B LD R1, A SUB R1, C ADD R1, R0
主要的指令
指令
意义
LD Ri, B ST Ri, B ADD A, B SUB A, B MUL A, B
把B单元的内容取到寄存器Ri 把寄存器Ri的内容存到B单元 A单元和B单元相加,并把结果存到A 单元 A单元和B单元相减,并把结果存到A 单元 A单元和把B单元相乘,并把结果存到A 单 元
DIV A, B
A单元和把B单元相除,并把结果存到A 单 元
JX
无条件转向X单元
CMP A, B 把A单元和把B单元比较 2020年8月13日8时12分
11.3 一个简单的代码生成器 在一个基本块范围实现代码生成器,它依次把每条中间代 码变换成目标代码,并且在一个基本块范围内考虑如何充 分利用寄存器的问题。即,一方面在基本块中,当生成计 算某变量值的目标代码时,尽可能地让该变量的值保留在 寄存器中,直到该寄存器必须用来存放别的变量或者已到 达基本块的出口为止;另一方面,后续的目标代码尽可能 地引用变量在寄存器中的值,而不访问主存。
(5)计算顺序选择 计算完成的顺序会影响目标代码的有效性。我们会看到, 有些计算顺序要求存放中的中间结果的寄存器数量少,从 而提高目标代码的效率。
2020年8月13日8时12分
11.2目标机器模型 假设目标计算机具有多个通用寄存器,这台机指令形式:
类型
指令形式
意义
直接地址型
op Ri, M
(Ri) op (M)→Ri
相关文档
最新文档