本文概述
代码生成器用于生成三地址语句的目标代码。它使用寄存器存储三个地址语句的操作数。
例:
考虑三个地址语句x:= y + z。它可以具有以下代码序列:
MOV x, R0
ADD y, R0
注册和地址描述符
- 寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。
- 地址描述符用于存储在运行时可以找到名称的当前值的位置。
代码生成算法
该算法将一个三地址语句序列作为输入。对于形式为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:=(a-b)+(a-c)+(a-c)可以转换为以下三个地址代码的序列:
t:= a-b
u:= a-c
v:= 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 |
评论前必须登录!
注册