MIPS中的程序计数器值无效

时间:2014-10-09 01:56:54

标签: assembly recursion mips

我的程序执行它应该递归执行的操作,但是在我的程序计算出我的最终答案之后,程序会以错误终止。更具体地说:错误:程序计数器值无效: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

1 个答案:

答案 0 :(得分:2)

执行的最后jr $ra会跳转到首次输入$ra之前设置的cValue。由于您没有初始jal cValue,因此$ra的值将是程序启动时的值。通常,这将在C运行时中的某个位置,在main返回时控制,这就是我在PcSpim中获得的行为。

我不知道为什么你得到“无效的程序计数器”错误,因为你没有指定你的执行环境。但正如我上面提到的,添加jal cValue应该通过在子例程完成后jal之后继续执行来解决问题。然后你可以做任何你需要做的事情来干净地退出程序。