MIPS汇编代码运行提示blt指令未知报错如何解决
问题原因与解决方法
报错核心原因
你遇到的blt指令未知报错,是因为blt属于MIPS伪指令,部分基础MIPS汇编器/旧版本模拟器(如低版本SPIM)默认未开启伪指令扩展支持,无法直接识别该指令。
解决方法
- 方法1:用基础MIPS指令替换
blt,无需修改模拟器配置blt $t0,$t1,calSum的功能等价于以下两条基础指令:
slt $at, $t0, $t1 # 如果$t0 < $t1,$at设为1,否则设为0 bne $at, $zero, calSum # $at不为0则跳转
- 方法2:开启模拟器的伪指令支持
如果你使用的是MARS、高版本SPIM模拟器,直接在设置项中开启「伪指令扩展支持」即可,默认状态下该选项通常是开启的。
代码其他需要修正的问题
你提供的代码还存在其他隐含bug,修改后才能正常运行:
- 字符串定义错误:
Message用.ascii定义,没有字符串结束符\0,打印时会输出乱码,需要改为.asciiz " The Sum is:" - 除法指令写法问题:第10行的
div $t5,$t0,$t3是三操作数除法伪指令,如果汇编器不支持伪指令,需要改为基础除法写法:
div $t0, $t3 # 用$t0除以$t3,商存lo寄存器,余数存hi寄存器 mflo $t5 # 取出商存入$t5
- 笔误修正:注释中出现的
$so应为$s0、$ao应为$a0,不影响运行但便于代码阅读。
修正后完整可运行代码
.data A: .word 4,8,12,16,20,24,28 Message: .asciiz " The Sum is:" .text li $t0,0 # 加载立即数0到$t0,作为数组下标 li $t1,7 # 加载立即数7到$t1,数组总长度 li $t3,2 # 加载立即数2到$t3,用于判断下标是否为偶数 la $t2,A # 加载数组A的首地址到$t2 li $s0,0 # 加载立即数0到$s0,存储累加和 calSum: div $t0, $t3 # $t0除以$t3 mfhi $t4 # 取出余数存入$t4 bnez $t4,X2 # 余数不为0(下标为奇数)则跳转到X2 lw $t6,0($t2) # 取出当前数组元素存入$t6 add $s0,$s0,$t6 # 累加到总和$s0 X2: addi $t2,$t2,4 # 数组指针移动到下一个元素 addi $t0,$t0,1 # 下标加1 slt $at, $t0, $t1 # 替换原blt指令的第一条基础指令 bne $at, $zero, calSum # 替换原blt指令的第二条基础指令 li $v0, 4 # 系统调用:打印字符串 la $a0, Message syscall move $a0,$s0 # 把累加和存入$a0准备打印 li $v0,1 # 系统调用:打印整数 syscall li $v0, 10 # 系统调用:退出程序 syscall
内容的提问来源于stack exchange,提问作者Rishi Batta
相关产品推荐
相关产品推荐

