编译原理 第八章代码生成 上海交通大学 张冬茉 Email:Zhang-dm@cssjtu.edu.cn 2004年6月
1 编译原理 第八章 代码生成 上海交通大学 张冬茉 Email:zhang-dm@cs.sjtu.edu.cn 2004年6月
本章目的 词法分析、语法分析、语法制导翻译及中间代码 生成是编译的前端,而目标代码的生成是编 译的后端,编译优化是可选部件。代码生成 的任务是在编译前端生成的中间代码的基础 上,生成等价有效的目标代码,这也是一种 程序变换,变换的结果是产生目标代码。等 价是任一种程序变换的基本要求,因此讨论 将集中在目标代码和如何产生有效的目标代 码上。所谓有效,当然是指目标代码占用的 空间要省,运行的时间要短,这涉及充分利 用寄存器和生成优化的代码序列的问题 2
2 本章目的 词法分析、语法分析、语法制导翻译及中间代码 生成是编译的前端,而目标代码的生成是编 译的后端,编译优化是可选部件。代码生成 的任务是在编译前端生成的中间代码的基础 上,生成等价有效的目标代码,这也是一种 程序变换,变换的结果是产生目标代码。等 价是任一种程序变换的基本要求,因此讨论 将集中在目标代码和如何产生有效的目标代 码上。所谓有效,当然是指目标代码占用的 空间要省,运行的时间要短,这涉及充分利 用寄存器和生成优化的代码序列的问题
第八章代码生成 §8.1目标代码 代码生成器的输入与输出 输入必须含有两部分:一部分是前端生成的中间代码 它是三地址表示的四元式。另一部分便是符号表,这 是由前端产生的,用以决定中间代码的数据对象运行 地址的所有信息都在符号表中存放着。 输出是目标代码,其形式可以是绝对机器语言、可重 定位机器语言或汇编语言的代码。 3
3 第八章 代码生成 §8.1 目标代码 一、代码生成器的输入与输出 输入必须含有两部分:一部分是前端生成的中间代码, 它是三地址表示的四元式。另一部分便是符号表,这 是由前端产生的,用以决定中间代码的数据对象运行 地址的所有信息都在符号表中存放着。 输出是目标代码,其形式可以是绝对机器语言、可重 定位机器语言或汇编语言的代码
、目标机器 目标机多种多样,要生成好的目标代码,必须熟悉目标机, 特别是指令系统的细节。作为一般讨论,我们不打算讨论 十分依赖于目标机器细节的内容,当然也不可能生成完整 的满意的代码。我们只讨论一般技术,只针对一种抽象的 目标机,它是简单的,作为各种目标机的子集,它是公共 的。 目标机具有几个通用寄存器,它们同时可作为变址器 4
4 二、目标机器 目标机多种多样,要生成好的目标代码,必须熟悉目标机, 特别是指令系统的细节。作为一般讨论,我们不打算讨论 十分依赖于目标机器细节的内容,当然也不可能生成完整 的满意的代码。我们只讨论一般技术,只针对一种抽象的 目标机,它是简单的,作为各种目标机的子集,它是公共 的。 目标机具有几个通用寄存器,它们同时可作为变址器
指令形式为二地址形式: op源,目的 其中op为操作码,源和目的作为两个操作对象都是数据域, 它们可以是内存地址,也可以是寄存器,或常数。指令的 地址模式可有: (1)绝对地址型: 0pRi,M(Ri)op(M)→Ri (2)寄存器型 op Ri, ri(Riop(r=Ri (3)变址型: op ri, c(ri(riop((ri+c)=i (4)间接型: op Ri, *Ri(Riop((ri)=Ri op ri, *M Riop((m)=Ri op Ri, *c(Ri(iop(((ri+c))=Ri
5 指令形式为二地址形式: op 源,目的 其中op为操作码,源和目的作为两个操作对象都是数据域, 它们可以是内存地址,也可以是寄存器,或常数。指令的 地址模式可有: (1) 绝对地址型: op Ri, M (Ri)op(M)Ri (2) 寄存器型: op Ri, Rj (Ri)op(Rj) Ri (3) 变址型: op Ri, c(Rj) (Ri)op((Ri)+c) Ri (4) 间接型: op Ri, *Rj (Ri)op((Rj)) Ri op Ri, *M (Ri)op((M)) Ri op Ri, *c(Rj) (Ri)op(((Ri)+c)) Ri