我的程序执行它应该递归执行的操作,但是在我的程序计算出我的最终答案之后,程序会以错误终止。更具体地说:错误:程序计数器值无效: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
答案 0 :(得分:2)
执行的最后jr $ra
会跳转到首次输入$ra
之前设置的cValue
。由于您没有初始jal cValue
,因此$ra
的值将是程序启动时的值。通常,这将在C运行时中的某个位置,在main
返回时控制,这就是我在PcSpim中获得的行为。
我不知道为什么你得到“无效的程序计数器”错误,因为你没有指定你的执行环境。但正如我上面提到的,添加jal cValue
应该通过在子例程完成后jal
之后继续执行来解决问题。然后你可以做任何你需要做的事情来干净地退出程序。