编译原理学习笔记25——目标代码的生成

  • 25.1 目标代码生成
  • 25.2 目标机器模型
  • 25.3 一个简单代码生成器
  • 25.4 待用信息和活跃信息
  • 25.5 变量地址和寄存器描述
  • 25.6 代码生成算法


目标代码有什么架构 目标代码生成时,应考虑_目标代码有什么架构

25.1 目标代码生成

目标代码有什么架构 目标代码生成时,应考虑_java_02

  • 输出
  • 绝对指令代码:能够立即执行的机器语言代码,所 有地址已经定位
  • 可重新定位指令代码:待装配的机器语言模块,执 视频区域行时,由连接装配程序把它们和某些运行程序连接 起来,转换成能执行的机器语言代码
  • 汇编指令代码:需要经过汇编程序转换成可执行的机器语言代码

目标代码生成需要考虑的问题

目标代码有什么架构 目标代码生成时,应考虑_c语言_03

  • 如何充分利用计算机的寄存器,减少目标代码 中访问存贮单元的次数
  • 在寄存器分配期间,为程序的某一点选择驻留在寄 存器中的一组变量
  • 在随后的寄存器指派阶段,挑出变量将要驻留的具 体寄存器

代码生成

  • 目标机器模型
  • 一个简单代码生成器

25.2 目标机器模型

一个抽象的计算机模型

  • 具有多个通用寄存器,可用作累加器和变址器
  • 运算必须在某个寄存器中进行
  • 含有四种类型的指令形式

25.3 一个简单代码生成器

最简单的代码生成

目标代码有什么架构 目标代码生成时,应考虑_java_04


最简单的代码生成

目标代码有什么架构 目标代码生成时,应考虑_c语言_05

带寄存器分配优化的代码生成

  • 以基本块为单位生成目标代码
  • 依次把四元式的中间代码变换成目标代码
  • 在基本块的范围内考虑如何充分利用寄存器
  • 进入基本块时,所有寄存器空闲
  • 离开基本块时,把存在寄存器中的现行的值存回主 存中,释放所有寄存器
  • 不特别说明,所有说明变量在基本块出口之后均为 非活跃变量

带寄存器分配优化的代码生成

目标代码有什么架构 目标代码生成时,应考虑_c语言_06

25.4 待用信息和活跃信息

待用信息

目标代码有什么架构 目标代码生成时,应考虑_学习_07


待用信息和活跃信息的表示

目标代码有什么架构 目标代码生成时,应考虑_java_08


待用信息和活跃信息的计算

目标代码有什么架构 目标代码生成时,应考虑_c语言_09


计算待

用信息和活跃信息的算法

目标代码有什么架构 目标代码生成时,应考虑_c语言_10


目标代码有什么架构 目标代码生成时,应考虑_寄存器_11

25.5 变量地址和寄存器描述

变量地址描述和寄存器描述

目标代码有什么架构 目标代码生成时,应考虑_学习_12


变量地址描述和寄存器描述

目标代码有什么架构 目标代码生成时,应考虑_寄存器_13

目标代码有什么架构 目标代码生成时,应考虑_java_14

25.6 代码生成算法

代码生成算法

目标代码有什么架构 目标代码生成时,应考虑_学习_15


目标代码有什么架构 目标代码生成时,应考虑_c语言_16


目标代码有什么架构 目标代码生成时,应考虑_学习_17


生成存数指令

目标代码有什么架构 目标代码生成时,应考虑_寄存器_18


为基本块生成代码示例

目标代码有什么架构 目标代码生成时,应考虑_学习_19


目标代码有什么架构 目标代码生成时,应考虑_java_20


目标代码有什么架构 目标代码生成时,应考虑_目标代码有什么架构_21