代码生成器2024 年 8 月 28 日 | 阅读 2 分钟 代码生成器用于为三地址语句生成目标代码。它使用寄存器来存储三地址语句的操作数。 示例考虑三地址语句 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:= (a-b) + (a-c) + (a-c) 可以转换为以下三地址代码序列 示例的代码序列如下 语句 | 生成的代码 | 寄存器描述符 寄存器为空 | 地址描述符 |
---|
t:= a - b | MOV a, R0 SUB b, R0 | R0 包含 t | t 在 R0 中 | u:= a - c | MOV a, R1 SUB c, R1 | R0 包含 t R1 包含 u | t 在 R0 中 u 在 R1 中 | v:= t + u | ADD R1, R0 | R0 包含 v R1 包含 u | u 在 R1 中 v 在 R1 中 | d:= v + u | ADD R1, R0 MOV R0, d | R0 包含 d | d 在 R0 中 d 在 R0 和内存中 |
|