Assembly MIPS中的程序计数器值无效

Assembly MIPS中的程序计数器值无效,assembly,recursion,mips,Assembly,Recursion,Mips,我的程序递归地执行它应该执行的操作,但是在我的程序计算出最终答案之后,程序就以错误终止。更具体地说:错误:无效的程序计数器值:0x00000000 我相信这是我的jr$ra的问题,因为在调试代码时,我看到错误在程序计算答案之后的第二个jr$ra抛出 我该如何解决这个问题?我需要程序打印出存储在寄存器$v0中的数字,但在我可以这样做之前,程序失败了 .data msg: .asciiz "Enter a positive integer n: \n" msg2: .asciiz "Its CVal

我的程序递归地执行它应该执行的操作,但是在我的程序计算出最终答案之后,程序就以错误终止。更具体地说:错误:无效的程序计数器值: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
之后继续执行。然后,您可以执行任何需要执行的操作,以干净地退出程序。

这就是问题所在。在移动$a0、$v0之后,我不得不在我的主要功能中添加一个jal。在我这样做之后,我可以返回到我的主函数,打印我的号码,然后终止。谢谢