您好,无论如何都可以避免在将 C 代码转换为 MIPS 时使用 %hi 和 %lo,我所有的 addiu 函数都出错了



这是我的一些代码:

la     $t2, $LC1
la      $t9,($t2)
addiu   $t3,$t2,%lo($LC1)
lw      $t8,4($t3)
addiu   $t3,$t2,%lo($LC1)
lw      $t7,8($t3)
addiu   $t3,$t2,%lo($LC1)
lw      $t6,12($t3)
addiu   $t3,$t2,%lo($LC1)
lw      $t5,16($t3)
addiu   $t3,$t2,%lo($LC1)
lw      $t4,20($t3)
addiu   $t3,$t2,%lo($LC1)

以下是错误:

Error in /Applications/mips7.asm line 101 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 103 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 105 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 107 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 109 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100

MIPS编译器,汇编器和链接器使用多个指令和%hilui%loaddiu

MARS不支持%hi%lo地址操作功能,而是提供了一个伪指令la,将标签的整个32位地址加载到寄存器中。 (此指令扩展为两个涉及lui的机器代码指令和另一个类似的ori

因此,使用%hi%lo将两条指令折叠成一个 MARSla,然后使用该地址实现预期效果:加载地址,或者加载或存储到全局数据标签。

如果预期效果是从全局/静态数据标签加载或存储,则 MARS 还支持lw $t0, label和伪指令形式sw $t0, label

一般来说,MARS 伪指令隐藏了底层机器代码细节,包括在lui指令之一可能被消除或共享时隐藏手动优化的机会。 例如,如果我们这样做global_var++,那应该只需要一个lui,一个lw和一个sw但在MARS中,lw $, label后跟sw $, label将涉及两个lui指令。


以下内容对 MARS 没有意义:

la     $t2, $LC1
addiu   $t3,$t2,%lo($LC1)

因为la已经为$LC1生成了完整的32位地址,所以没有必要向该指针添加偏移%lo($LC1)

相关内容

  • 没有找到相关文章

最新更新