第10章(2)代码生成 ■目标机器模型 ■一个简单的代码生成器 ■作业 2025/4/2 课程目录国m
2025/4/2 第10章 (2) 代码生成 ◼ 目标机器模型 ◼ 一个简单的代码生成器 ◼ 作业 课程目录 1/11
代码生成概述p279 ■逻辑阶段编译程序的最后一个阶段 ■输入和输出中间代码等价的目标代码 ■目标代码的一般形式 ◆汇编语言代码 口优点:目标程序好读、可移植 缺点:需经汇编器辅助代码生成 ■代码生成器的设计环境 ◆要依赖于目标机器、指令系统和操作系统。 2025/4/2 ☒221
2025/4/2 代码生成概述 p279 ◼ 逻辑阶段 编译程序的最后一个阶段 ◼ 输入和输出 中间代码 等价的目标代码 ◼ 目标代码的一般形式 ◆汇编语言代码 优点:目标程序好读、可移植 缺点:需经汇编器辅助代码生成 ◼ 代码生成器的设计环境 ◆ 要依赖于目标机器、指令系统和操作系统。 2/11
目标代码生成器的基本设计要求 ■目标代码尽可能的短 ■充分地发挥目标机可用资源效率 例如 ◆尽可能地使用执行速度快的指令 ◆充分利用寄存器和变址器,以节省访 问内存的时间 2025/4/2 31
2025/4/2 目标代码生成器的基本设计要求 ◼ 目标代码尽可能的短 ◼ 充分地发挥目标机可用资源效率 例如: ◆尽可能地使用执行速度快的指令 ◆充分利用寄存器和变址器,以节省访 问内存的时间 3/11
目标机模型假想的计算机模型p280 ■常备指令arc一源操作数 dst一目的操作数 指令形式 意义 举例 LD dst,arc (arc)→dst LDR1,B(B)→R1取数 MOVE LDR1,#11→R1 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)-(T)→R MUL dst,arc (dst)*(arc)→dst MUL R1,D(R1)*(D)→R1 DIV dst,arc (dst)/(arc)→dst DIV R1,A(R1)/(A)→R1 e●p●●● ●●●●● ●●●●●● 2025/4/2 国4m
2025/4/2 目标机模型 假想的计算机模型 p280 ◼ 常备指令 arc—源操作数 dst—目的操作数 指令形式 意 义 举 例 LD dst,arc (arc)dst LD R1,B (B)R1 取数 MOVE LD R1,#1 1R1 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
一个简单的代码生成器 ■算法策略 ◆依次把每条中间代码变换成目标代码 ◆在一个基本块范围内充分利用寄存器 ■如何充分利用寄存器一 做到 ◆尽可能地让变量(存结果)的值保留在寄存器中 ◆尽可能引用变量(操作数)在寄存器中的值,直到 该寄存器必须用来存放别的变量值或者已到达基本 块出口为止 ■为了生成高效的目标代码,充分利用寄存器, 代码生成器需要了解如下信息 ◆哪些变量以后还会被引用 ◆变量的值当前在何处一 寄存器描述和地址描述 2025/4/2 5/11
2025/4/2 一个简单的代码生成器 ◼ 算法策略 ◆ 依次把每条中间代码变换成目标代码 ◆ 在一个基本块范围内充分利用寄存器 ◼ 如何充分利用寄存器——做到 ◆ 尽可能地让变量(存结果)的值保留在寄存器中 ◆ 尽可能引用变量(操作数)在寄存器中的值,直到 该寄存器必须用来存放别的变量值或者已到达基本 块出口为止 ◼ 为了生成高效的目标代码,充分利用寄存器, 代码生成器需要了解如下信息 ◆ 哪些变量以后还会被引用 ◆ 变量的值当前在何处——寄存器描述和地址描述 5/11