为何MIPS汇编代码输出结果总是比预期值大1?
问题分析与解决
哈哈,这个问题我刚学MIPS的时候也踩过坑!你的输出总是比预期大1,核心问题出在这一行代码:
add $a0, $a0, $t0
为什么会多1?
在MIPS模拟器(比如SPIM或者MARS)启动程序时,$a0寄存器的初始值并不是0——绝大多数情况下它的默认初始值是1。你这里用add指令是把计算好的$t0(也就是1+1+1=3)加到了$a0原来的初始值上,所以最终$a0的值就是1+3=4,这就导致每次输出都比预期结果大1。
修正方案
你需要直接把计算结果赋值给$a0,而不是做累加操作。有几种简单的实现方式:
- 用
move指令(最直观易懂):move $a0, $t0 - 或者用
addi指令将$t0与0相加,本质也是赋值:addi $a0, $t0, 0 - 也可以先手动把
$a0清零,再执行累加:li $a0, 0 add $a0, $a0, $t0
修正后的完整代码如下:
.data x: .word 1 y: .word 1 z: .word 1 .text main: lw $t0, x lw $t1, y lw $t2, z add $t0, $t0, $t1 # t0= x+y add $t0, $t0, $t2 # t0= x+y+z move $a0, $t0 # 直接将计算结果存入a0寄存器 li $v0, 1 syscall li $v0, 10 syscall
现在再运行这段代码,输出就会是你预期的3啦~
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

