个性化阅读
专注于IT技术分析

代码生成器

本文概述

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

例:

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

MOV x, R0
         ADD 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-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中的v
d:= v + u 加R1, R0 MOV R0, d R0包含d R0中的d R0和内存中的d
赞(0)
未经允许不得转载:srcmini » 代码生成器

评论 抢沙发

评论前必须登录!