📜  代码生成

📅  最后修改于: 2020-12-06 08:01:59             🧑  作者: Mango

代码生成器

代码生成器用于生成三地址语句的目标代码。它使用寄存器存储三个地址语句的操作数。

例:

考虑三个地址语句x:= y + z。它可以具有以下代码序列:

注册和地址描述符:

  • 寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。
  • 地址描述符用于存储在运行时可以找到名称的当前值的位置。

代码生成算法:

该算法将一个三地址语句序列作为输入。对于形式为a:= b op c的每三个地址语句,执行各种操作。这些如下:

  • 调用函数getreg以找出应该存储计算结果b op c的位置L。
  • 请查阅地址描述中的y来确定y'。如果y的值当前在存储器中并同时注册两个寄存器,则首选寄存器y'。如果y的值尚未在L中,则生成指令MOV y',L将y的副本放置在L中。
  • 生成指令OP z',L ,其中z'用于显示z的当前位置。如果z在两个位置中,则首选寄存器而不是存储位置。更新x的地址描述符以指示x在位置L。如果x在L中,则更新其描述符并将x从所有其他描述符中删除。
  • 如果y或z的当前值没有下一个用途,或者没有退出该块或退出寄存器,则更改寄存器描述符以指示在执行x:= y op z之后,这些寄存器将不再包含y或z。

生成分配语句的代码:

赋值语句d:=(ab)+(ac)+(ac)可以转换为以下三个地址代码的序列:

t:= a-b
        u:= a-c
        v:= t +u 
        d:= v+u

该示例的代码序列如下:

Statement Code Generated Register descriptor
Register empty
Address descriptor
t:= a – b MOV a, R0
SUB b, R0
R0 contains t t in R0
u:= a – c MOV a, R1
SUB c, R1
R0 contains t
R1 contains u
t in R0
u in R1
v:= t + u ADD R1, R0 R0 contains v
R1 contains u
u in R1
v in R1
d:= v + u ADD R1, R0
MOV R0, d
R0 contains d d in R0
d in R0 and memory