[计算机软件及应用]第十二章代码生成
第12章 代码生成 12.1 代码生成概述 将中间语言转换成特定目标机的机器语言或汇编语言。 代码生成要考虑的主要问题: 基本块的代码生成:在一个基本块范围内考虑如何充分利用寄存器的问题。 具体细节依赖于目标机器的指令系统、硬件配置和操作系统。 目标代码的质量:占用空间、执行效率 12.1.1 代码生成程序在编译系统中的位置 目标代码的三种形式 地址代真的机器代码 待装配的机器代码模块 汇编语言(宏汇编)机器指令形式 12.1.2 设计代码生成程序的基本问题 1.代码生成程序的输入 中间代码和符号表中的信息 语义分析时直接生成代码 2.指令选择:指令系统 3.寄存器分配:充分利用寄存器 4.指令调度:选择计算次序 指令选择 选择计算机指令系统 基本原则 (1) 减小产生代码的尺寸 (2) 减小目标代码的执行时间 (3) 降低目标代码的能耗 指令选择 对于同一个指令系统,对于同样的中间代码,可以选择不同的指令生成代码序列。 例如:x:=y+z,其中x,y,z均为静态变量,代码序列如下: LD R0 ,y ADD R0 ,z ST R0 ,x 四元式 a:=a+1 用 INC a 一条指令即可实现。 寄存器分配 指令调度 确定程序指令的执行顺序 实现(a+b)+c的优化与否的两个指令序列 LD R1 ,a LD R1 ,a LD R2 ,b LD R2 ,b NOP LD R3 ,c ADDI R1 ,R1 ,R2 ADDI R1 ,R1 ,R2 LD R2 ,c ADDI R1 ,R1 ,R3 NOP ADDI R1 ,R1 ,R2 T4:=A+B-(E-(C+D)) T1:= A+B MOV A,R0 T2:=C+D ADD B,R0 T3:=E-T2 MOV C,R1 T4:=T1-T3 ADD D,R1 MOV R0,T1 MOV E, R0 SUB R1,R0 MOV T1,R1 SUB R0,R1 MOV R1, T4 T4:=A+B-(E-(C+D)) T2:=C+D MOV C,R0 T3:=E-T2 ADD D,R0 T1:= A+B MOV E,R1 T4:=T1-T3 SUB R0,R1 MOV A,R0 ADD B, R0 SUB R1,R0 MOV R0,T4 12.2 一个简单的代码生成程序 以四元式的中间代码为输入,将其转换成给定的M 计算机的目标代码 在一个基本块内如何充分利用寄存器以提高目标代码的运行效率。 寄存器分配的一般算法 12.2.1 计算机模型 M计算机,具有n+1 个寄存器R0~Rn 作为累加器和/或变址器 ‘op’表示运算符,‘M’表示内存单元,变量名表示变量所在单元,‘C’表示常量,‘*’表示间址方式存取。 指令包含四种类型:直接地址型、寄存器型、变址型、间址型 模型计算机的指令 若op是一目运算符,则“op Ri,M”的意义为:op (M)? Ri,op为二目运算符时如下: 12.2.2 待用信息链表法 尽可能地让该变量的值保留在寄存器中 尽可能引用变量在寄存器中的值 释放基本块内不再引用的变量所占的寄存器 可从基本块的出口由后向前扫描,对每个变量建立相应的待用信息链和活跃变量信息链