编译原理——目标代码生成

这个代码实现了一个简化的代码生成器,用于将中间代码 (IR) 转换为 MIPS 汇编代码。该代码基于编译原理中常见的中间代码生成思想,将源代码的操作符和操作数生成对应的汇编指令。下面是对此代码的详细分析:

核心部分

  1. LoadFromMem 和 StoreToMem 函数
    这些函数用于在 MIPS 汇编指令中从内存加载数据到寄存器,或将寄存器中的数据存储到内存。根据操作数是否是全局变量决定是否使用 $gp$sp

    • LoadFromMem(string, Opn, string):从指定偏移量的内存地址中加载数据到寄存器 Reg1
    • LoadFromMem(string, Opn, Opn, string):用于带两个偏移量的内存加载,例如数组中的数据。
    • StoreToMem(string, Opn, string):将寄存器 Reg1 的值存储到指定偏移量的内存地址中。
    • StoreToMem(string, Opn, Opn, string):类似于 LoadFromMem,但用于存储数据。
  2. GenObject 函数
    GenObject 函数的主要任务是将中间代码序列 (IRCodes) 逐条转换为汇编代码并写入文件 ObjectFile.s

    • 初始化部分:函数开头生成了一些基本的数据段和文本段,用于处理输入和输出(如 readwrite 函数)。
    • 中间代码生成:逐条遍历中间代码,生成相应的 MIPS 汇编指令。

各类操作的代码生成

  1. 赋值操作 (ASSIGN):

    • 如果操作数是常量,直接将值加载到 $t1
    • 如果是变量或数组,使用 LoadFromMem 将值加载到 $t1,然后用 StoreToMem 将值存储到结果操作数的内存地址。
  2. 数组访问 (ARRLOADARRASSIGN):

    • ARRLOAD 用于从数组中加载值,将两个偏移量的数据加载到 $t1
    • ARRASSIGN 将值存储到数组中的特定位置。
  3. 算术操作 (PLUS, MINUS, STAR, DIV, MOD):

    • 先从内存加载两个操作数到 $t1$t2
    • 根据操作类型生成不同的 MIPS 指令(如 add, sub, mul, div 等)。
    • 将计算结果存储到 $t3,再使用 StoreToMem 存储结果。
  4. 逻辑操作 (AND, OR, NOT):

    • 对布尔值的逻辑操作,如 AND, OR,先将操作数转换成 01
    • NOT 操作将值反转。
    • 最终的结果存储在 $t3 中,再写入结果变量。
  5. 递增/递减操作 (DPLUS, DMINUS, PLUSD, MINUSD):

    • 这些操作实现了变量的自增/自减。
    • 根据操作符,将 $t1 中的值加 1 或减 1 后再存储到内存。
  6. 一元负号操作 (UMINUS):

    • 将值乘以 -1,实现负号操作。
  7. 数组的递增/递减 (ARRDPLUS, ARRDMINUS, ARRPLUSD, ARRMINUSD):

    • 对数组的元素进行自增或自减操作。
  8. 条件跳转 (JLE, JLT, JGE, JGT, JEQ, JNE):

    • 实现了条件跳转操作。
    • 加载两个操作数后,根据条件生成对应的跳转指令。
  9. 函数调用和返回 (CALL, CALL0, RETURN):

    • 函数调用涉及将参数传递给被调用函数,调整栈指针并跳转到函数。
    • readwrite 函数进行了特殊处理,以支持 I/O 操作。
  10. 无条件跳转 (GOTO):

    • 简单的无条件跳转,使用 j 指令跳转到目标标签。
  11. 标签和函数定义 (LABEL, FUNCTION):

    • 为程序中的标签和函数生成汇编标签,以便可以进行跳转和调用。
  12. 程序结束 (END):

    • 使用 li $v0,10\n syscall 停止程序执行。

总结

这段代码定义了一个 MIPS 汇编代码生成器,通过遍历中间代码序列将每条指令转化为 MIPS 汇编语言指令,并输出到文件 ObjectFile.s。通过对不同类型的操作符和操作数的处理,生成了包含赋值、算术、逻辑、函数调用、条件跳转等的完整 MIPS 汇编代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值