assembly - MIPS 中的程序计数器值无效

标签 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

最佳答案

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

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

关于assembly - MIPS 中的程序计数器值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269146/

相关文章:

linux - ARB组件如何组装

assembly - 从引导加载程序读取的磁盘扇区是否可以超过 512 字节?

assembly - x86汇编代码中 "mov eax, cr3; mov cr3, eax"的作用是什么?

assembly - 帧指针 MIPS 的使用

mips - 如何在 MIPS 中制作一个重音不敏感的回文检查器?

assembly - Intel VEX 前缀,L 位值的行为与文档不符

windows - 如何杀死进程窗口的所有递归子级

algorithm - 树路径长度的递归定义

jquery - 循环,每次迭代仅在 jQuery 延迟之后发生,何时/然后可能没有递归?

MIPS 跳转指令范围