首页 > 解决方案 > %hi 和 %lo 的 MIPS 错误

问题描述

lui     $v0,%hi(length)
lw      $v1,%lo(length)($v0)
li      $v0,3                        # 0x3
bne     $v0,$zero,1f
div     $zero,$v1,$v0
break   7
mfhi    $v0
mflo    $v0
sw      $v0,28($fp)
lw      $a1,28($fp)
lui     $v0,%hi(game_over)
addiu   $a0,$v0,%lo(game_over)
jal     printf
nop

当我尝试为我的 MIPS 代码运行它时,会出现以下错误:

您的程序产生了这些错误: spim: (parser) Unknown character on line 180 of file measure.s lui $v0,%hi(length)

spim:(解析器)文件measurement.s指令第181行的语法错误在0x00400038 [0x00400038] 0x0c000000 jal 0x00000000 [init_measure]处引用未定义符号;第159话

我是否需要将 %hi 和 $lo 替换为代码中的其他内容?

编辑对于以下代码:

sw      $v0,16($fp)
lui     $a0,%hi(grid)
lw      $v1,12($fp)
nop
move    $v0,$v1
sll     $v0,$v0,4
subu    $v0,$v0,$v1
addiu   $v1,$a0,%lo(grid)
addu    $v1,$v0,$v1
lw      $v0,16($fp)

lui     $v0,%hi(column)
lb      $v0,%lo(column)($v0)
nop

sw      $v0,12($fp)
lui     $v0,%hi(column)
addiu   $v1,$v0,%lo(column)
lw      $v0,8($fp)
nop

addiu   $v1,$v0,-1
lui     $v0,%hi(growth)
sw      $v1,%lo(growth)($v0)
b       true
nop

我会以类似的方式或不同的方式替换 %hi 和 % lo 吗?

标签: mips

解决方案


这些似乎是 spim 不支持的运算符。%LO(label)应该给你标签地址的下半部分和%HI(label)上半部分。

您可以替换以下两条指令:

lui     $v0,%hi(length)
lw      $v1,%lo(length)($v0)

有了这个:

la     $v0,length
lw     $v1,0($v0)

因此,我们使用 la 伪指令将标签的整个地址加载到寄存器(在示例中),然后您直接使用偏移量$v0加载其内存内容。请注意,伪指令将对任意标签地址使用 2 条指令(并保留上半部分地址)。另请注意,在您的代码中仍将保留标签地址的上半部分,而在第二个片段中它将包含整个地址。0lwla$at$v0

同样,而不是

lui     $v0,%hi(game_over)
addiu   $a0,$v0,%lo(game_over)

你可以发出:

la $a0, game_over

在这种情况下,您的代码将以game_over$a0标签的地址结尾(如第二个片段中所示),并保留该地址的下半部分。伪指令将保留标签的上半部分$v0la$at


推荐阅读