mips - %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 吗?
解决方案
这些似乎是 spim 不支持的运算符。%LO(label)
应该给你标签地址的下半部分和%HI(label)
上半部分。
您可以替换以下两条指令:
lui $v0,%hi(length)
lw $v1,%lo(length)($v0)
有了这个:
la $v0,length
lw $v1,0($v0)
因此,我们使用 la 伪指令将标签的整个地址加载到寄存器(在示例中),然后您直接使用偏移量$v0
加载其内存内容。请注意,伪指令将对任意标签地址使用 2 条指令(并保留上半部分地址)。另请注意,在您的代码中仍将保留标签地址的上半部分,而在第二个片段中它将包含整个地址。0
lw
la
$at
$v0
同样,而不是
lui $v0,%hi(game_over)
addiu $a0,$v0,%lo(game_over)
你可以发出:
la $a0, game_over
在这种情况下,您的代码将以game_over$a0
标签的地址结尾(如第二个片段中所示),并保留该地址的下半部分。伪指令将保留标签的上半部分$v0
la
$at
推荐阅读
- mysql - 使用 REGEXP_REPLACE 将字段从一个表复制到另一个表
- java - Java中的Else-if语句不起作用,我做错了什么?
- vue.js - 如何从组件“A”更新 vuex 状态,它应该反映在组件“B”上
- angular - 错误 npm install --save @angular/fire@5.1.1 firebase@5.8.4 gyp ERR!构建错误
- r - R - 查找年龄列表的平均值
- assembly - cmpl $0x1, -0x18(ebp) 在 AT&T 中有什么作用?
- apache-kafka - 有什么方法可以检测 Kafka 中已删除的消费者组?
- powershell - 批量 Azure AD 更新
- java - 无法使用 AccessibilityService 和 DispatchGesture
- android - 从 Firebase 存储上传时出现 RuntimeException