代码生成器详解

本文概述

  • 注册和地址描述符
  • 代码生成算法
【代码生成器详解】代码生成器用于生成三地址语句的目标代码。它使用寄存器存储三个地址语句的操作数。
例:
考虑三个地址语句x:= y + z。它可以具有以下代码序列:
MOV x, R0ADD y, R0

注册和地址描述符
  • 寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。
  • 地址描述符用于存储在运行时可以找到名称的当前值的位置。
代码生成算法该算法将一个三地址语句序列作为输入。对于形式为a:= b op c的每三个地址语句, 执行各种操作。这些如下:
  1. 调用函数getreg找出应该存储计算结果b op c的位置L。
  2. 请查阅地址描述中的y来确定y’ 。如果y的值当前在存储器中并同时注册两个寄存器, 则首选寄存器y’ 。如果y的值尚未在L中, 则生成指令MOV y’ , L将y的副本放置在L中。
  3. 生成指令OP z’ , L, 其中z’ 用于显示z的当前位置。如果z在两个位置中, 则首选寄存器而不是存储位置。更新x的地址描述符以指示x在位置L。如果x在L中, 则更新其描述符并将x从所有其他描述符中删除。
  4. 如果y或z的当前值没有下一个用途, 或者不在该块的退出或在寄存器中存在, 则更改寄存器描述符以指示在执行x:= y op z之后, 这些寄存器将不再包含y或z。
生成分配语句的代码:
赋值语句d:=(a-b)+(a-c)+(a-c)可以转换为以下三个地址代码的序列:
t:= a-bu:= a-cv:= t +u d:= v+u

该示例的代码序列如下:
声明 生成代码 注册描述符注册为空 地址描述符
t:= a-b MOV a, R0 SUB b, R0 R0包含t R0中的t
u:= a-c MOV a, R1 SUB c, R1 R0包含t R1包含u R0中的t R1中的u
v:= t + u 加R1, R0 R0包含v R1包含u R1中的u v R1中的
d:= v + u 加R1, R0 MOV R0, d R0包含d R0中的d R0和内存中的d

    推荐阅读