我的程序递归地执行它应该执行的操作,但是在我的程序计算出最终答案后,程序因错误而终止。更具体地说:错误:程序计数器值无效:0x00000000
我相信这是我的 jr $ra 的问题,因为在调试我的代码时,我发现在程序计算出答案后,错误在第二个 jr $ra 处抛出。
我该如何解决这个问题?我需要程序打印出寄存器 $v0 中存储的数字,但在我执行此操作之前程序失败了。
.data
msg: .asciiz "Enter a positive integer n: \n"
msg2: .asciiz "Its CValue is: \n"
.text
li $v0,4
la $a0,msg
syscall
li $v0,5
syscall
move $a0,$v0
cValue:
addi $sp,$sp,-4
sw $ra,0($sp)
bgt $a0,1,recursive
li $v0,1
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
recursive:
addi $a0,$a0,-1
jal cValue
li $t7,3
mult $v0,$t7
mflo $v0
addi $v0,$v0,1
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
最佳答案
最后执行的jr $ra
将跳转到首次输入cValue
之前设置的$ra
。由于您没有初始 jal cValue
,因此 $ra
的值将是程序启动时的值。通常,当您的 main
返回时,C 运行时中的某个地方会进行控制,这就是我在 PcSpim 中得到的行为。
我不知道为什么您会收到“无效程序计数器”错误,因为您尚未指定执行环境。但正如我上面提到的,添加 jal cValue
应该可以解决问题,方法是在子例程完成后在 jal
之后继续执行。然后你就可以做任何你需要做的事情来干净地退出程序。
关于assembly - MIPS 中的程序计数器值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269146/