本文概述
- 注册和地址描述符
- 代码生成算法
例:
考虑三个地址语句x:= y + z。它可以具有以下代码序列:
MOV x, R0ADD y, R0
注册和地址描述符
- 寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。
- 地址描述符用于存储在运行时可以找到名称的当前值的位置。
- 调用函数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-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 |