
第十二章 目标代码生成 代码生成概述 ■一个简单的代码生成器 ◆且标机器模型 ◆一个简单的代码生成器 寄存器分配(略) ■DAG的目标代码(略) ■作业 2025/412 课程目录国心
2025/4/2 1 第十二章 目标代码生成 ◼ 代码生成概述 ◼ 一个简单的代码生成器 ◆ 目标机器模型 ◆ 一个简单的代码生成器 ◼ 寄存器分配(略) ◼ DAG的目标代码(略) ◼ 作业 课程目录

目标代码生成概述p274 ■于 逻辑阶段编译程序的最后一个阶段 ■输入和输出中间代码 等价的目标代码 ■目标代码的一般形式 ◆绝对机器代码所有地址均已定位 0 优点:可立即执行 缺点:不能独立编译各模块,灵活性差 ◆可再定位机器代码需经连接与装入才可执行° 口优点:子程序可单独编译 缺点:需经汇编器辅助代码生成 0 ◆汇编语言代码 0 优点:目标程序好读、可移植 ▣缺点:需经汇编器辅助代码生成 202 国
2025/4/2 2 目标代码生成概述 p274 ◼ 逻辑阶段 编译程序的最后一个阶段 ◼ 输入和输出 中间代码 等价的目标代码 ◼ 目标代码的一般形式 ◆绝对机器代码 所有地址均已定位 优点:可立即执行 缺点:不能独立编译各模块,灵活性差 ◆可再定位机器代码 需经连接与装入才可执行 优点:子程序可单独编译 缺点:需经汇编器辅助代码生成 ◆汇编语言代码 优点:目标程序好读、可移植 缺点:需经汇编器辅助代码生成

12.1代码生成概述基本问题p274 ■代码生成器的设计环境 ◆要依赖于目标机器和操作系统 ■输入 ◆源程序的中间表示、符号表中的信息 ■目标程序 ◆汇编语言 ■指令选择 ◆指令集丰富、选择合适 ■寄存器分配 ◆有效合理使用寄存器、提高代码质量 ■计算顺序选择 ◆影响代码的有效性 2025/47 国② 3
2025/4/2 3 12.1 代码生成概述 基本问题 p274 ◼ 代码生成器的设计环境 ◆要依赖于目标机器和操作系统 ◼ 输入 ◆源程序的中间表示、符号表中的信息 ◼ 目标程序 ◆汇编语言 ◼ 指令选择 ◆指令集丰富、选择合适 ◼ 寄存器分配 ◆有效合理使用寄存器、提高代码质量 ◼ 计算顺序选择 ◆影响代码的有效性

目标代码生成器的基本设计要求 ■使所生成的目标代码尽可能的短 ■能较充分地发挥目标计算机可用资源的效率 例如: ◆尽可能地使用执行速度快的指令 ◆充分利用计算机的寄存器和变址器,以节省访问 内存的时间 2025/ 章节目绿国园
2025/4/2 4 目标代码生成器的基本设计要求 ◼ 使所生成的目标代码尽可能的短 ◼ 能较充分地发挥目标计算机可用资源的效率 例如: ◆尽可能地使用执行速度快的指令 ◆充分利用计算机的寄存器和变址器,以节省访问 内存的时间 章节目录

12.2一个简单的代码生成程序目标机模型p278 ■问题提出 ◆代码生成程序总是针对某一具体的计算机实现的 ◆因此,试图脱离具体的计算机来一般性讨论生成高效的 目标代码的全部细节是不合适的,也是不可行的 ◆然而又不可能只局限于某一特定的计算机 ■折中方案 ◆定义一种假想的计算机模型,具有实际计算机的共同特 征 ◆依此模型为依据,讨论代码生成中的某些主要问题 进入下一环节 2025/472 KD 5
2025/4/2 5 12.2 一个简单的代码生成程序 目标机模型 p278 ◼ 问题提出 ◆代码生成程序总是针对某一具体的计算机实现的 ◆因此,试图脱离具体的计算机来一般性讨论生成高效的 目标代码的全部细节是不合适的,也是不可行的 ◆然而又不可能只局限于某一特定的计算机 ◼ 折中方案 ◆定义一种假想的计算机模型,具有实际计算机的共同特 征 ◆依此模型为依据,讨论代码生成中的某些主要问题 进入下一环节

目标机模型p278 ■指令形式(寻址方式 (R)一通用寄存器R1中的内容(M)一内存单元M中的内 容类 型 指令形式 意义(设op是二目运算符) 直接地址型 op Ri,M (Ri)op(MW→Ri 寄存器型 op Ri,Rj (Ri)op(R)→R 变址型 op Ri,c(Rj) (Ri)op((R)+c)→Ri 间接型 op Ri,*M (R)op(M)→R1 op Ri,*Rj (R)op(R)→R1 op Ri,*c(Rj) (Ri)op((R)+c))→Ri 直接操作数型 op Ri,#X (Ri)opX→Ri 2025 国回 6
2025/4/2 6 目标机模型 p278 ◼ 指令形式(寻址方式) (Ri)—通用寄存器Ri中的内容 (M)—内存单元M中的内 容 类 型 指令形式 意义(设op是二目运算符) 直接地址型 op Ri,M (Ri)op(M)Ri 寄存器型 op Ri,Rj (Ri)op(Rj)Ri 变址型 op Ri,c(Rj) (Ri)op((Rj)+c)Ri 间接型 op Ri,*M (Ri)op((M))Ri op Ri,*Rj (Ri)op((Rj))Ri op Ri,*c(Rj) (Ri)op(((Rj)+c))Ri 直接操作数型 op Ri,#X (Ri)op X Ri

目标机模型p278 ■常备指令 arc一源操作数dst一目的操作数 指令形式 意义 举 例 LD dst,arc (arc)→dst LDR1,B(B)→R1 LDR1,#11→R1 LD R1,*(4(Ro))(((Ro)+4))=Ri ST arc,dst (arc)→dst STR1,B(R1)→B ADD dst,arc (dst)+(arc)→dst ADD R1,Ro(R1)+(Ro)→R1 SUB dst,arc( (dst)-(arc)→dst SUB R1,T1(R1)-(Ti)→R1 MUL dst,arc (dst)*(arc)=dst MUL R1,D (R1)*(D)=RI DIV dst,arc (dst)/(arc)=dst DIV R1,A (R1)/(A)=Ri 2025/472 国应 7
2025/4/2 7 目标机模型 p278 ◼ 常备指令 arc—源操作数 dst—目的操作数 指令形式 意 义 举 例 LD dst,arc (arc)dst LD R1,B (B)R1 LD R1,#1 1R1 LD R1,*(4(R0))(((R0)+4))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

执行代价(补充) ■衡量目标程序工作效率的指标 ◆目标程序的长短 ◆目标程序的执行时间—取决于访问内存的次数 ■一条指令执行代价 ◆定义:执行该指令所需访问内存的总次数 ◆值=该指令访问内存的次数+1(取指令访问一次内存) ■目标程序的执行代价 ●定义:各条指令执行代价总和 ◆特点:该值越低目标程序的执行效率越高 产生目标代码时,应尽可能选用执行代价较小的指令 2025/42 国⊙
2025/4/2 8 执行代价(补充) ◼ 衡量目标程序工作效率的指标 ◆目标程序的长短 ◆目标程序的执行时间——取决于访问内存的次数 ◼ 一条指令执行代价 ◆定义:执行该指令所需访问内存的总次数 ◆值=该指令访问内存的次数+1(取指令访问一次内存) ◼ 目标程序的执行代价 ◆定义:各条指令执行代价总和 ◆特点:该值越低目标程序的执行效率越高 产生目标代码时,应尽可能选用执行代价较小的指令

执行代价举例 ■对三地址代码A:=BC 指令 执行代价 ■ 若B,C分别在RO,R1,且B值 (0+1) 以后不用,则 ■LDRo,R1 1 (1ADD Ro,R1 (0+1)1 ■LD R1,M (1+1) 2 ■若B在Ro,C在内存,且B值 ■STR1,T1 (1+1) 2 以后不用,则 ■ADDR1,#1 (1+1) 2 (2)ADDR1,C(1+1) 2 ■ADD Ro,*R1(1+1) 2 或(3)LDR1,C ■LDRo,*M (2+1)3 ADD Ro,R1 (1+2)3 ■第(3)种特别适合于C值在块内还要被引用的情况, 虽然它的执行代价比前两种形式都高,但由于以后可 从寄存器中取得C值,故从总程序的执行代价上看, 仍是合算的 2025/4/2 章节目录国 9
2025/4/2 9 执行代价举例 ◼ 指令 执行代价 ◼ LD R0,R1 (0+1) 1 ◼ LD R1,M (1+1) 2 ◼ ST R1,T1 (1+1) 2 ◼ ADD R1,#1 (1+1) 2 ◼ ADD R0,*R1 (1+1) 2 ◼ LD R0,*M (2+1) 3 ◼ 对三地址代码A:=B+C ◼ 若B,C分别在R0,R1,且B值 以后不用,则 (1)ADD R0,R1 (0+1) 1 ◼ 若B在R0,C在内存,且B值 以后不用,则 (2)ADD R1,C (1+1) 2 或(3)LD R1,C ADD R0,R1 (1+2) 3 ◼ 第(3)种特别适合于C值在块内还要被引用的情况, 虽然它的执行代价比前两种形式都高,但由于以后可 从寄存器中取得C值,故从总程序的执行代价上看, 仍是合算的 章节目录

12.2一个简单的代码生成器 概述 ■待用信息(略) ■寄存器描述和地址描述 ■简单代码生成算法 2025/4 章节目绿回 10
2025/4/2 10 12.2 一个简单的代码生成器 ◼概述 ◼待用信息(略) ◼寄存器描述和地址描述 ◼简单代码生成算法 章节目录