MIPS递归计划

时间:2014-09-24 19:53:52

标签: recursion mips

我是MIPS的新手,我正在尝试编写一个递归程序。该程序将计算f(N),其中N是一个大于零的整数。 f(N)= 3*(N-1)+f(N-1)+1。基本案例是f(0)=2。但是,当我尝试运行我的程序时,它会无限期地运行,因此我猜测递归调用永远不会结束。我似乎无法找到问题所在。我的代码如下。

    .data
    prompt: .asciiz "Please enter a number"

    .text
    .globl main

    main:
        li $v0, 4 
        la $a0, prompt 
        syscall 
        li $v0, 5
        syscall
        move $a0, $v0
        jal factfunc
        move $a0, $v0
        li $v0, 1
        syscall
        li $v0, 10
        syscall

   factfunc:
        addiu $sp, $sp, -8
        sw $ra, 4($sp)
        sw $s0, 0($sp)
        move $s0, $a0
        blez $s0, endCondition
        addi $a0, $a0, -1
        jal factfunc
        li $s1, 0
        li $s2, 0
        addi $s1, $s0, -1
        move $s2, $s1
        addu $s2, $s2, $s2
        addu $s1, $s2, $s1
        addu $v0, $v0, $s1
        addi $v0, $v0, 1

  cleanUp: 
       lw $s0, 0($sp)
       lw $ra, 4($sp)
       jr $ra

  endCondition:
       li $v0, 2
       b cleanUp

我非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

您忘记在fastfunc程序结束时缩小堆栈。

在我jr $ra添加addi $sp $sp 8之前,它开始按预期停止。

答案 1 :(得分:0)

您的返回地址$ra正在加载0x00400050(来自factfunc)而不是0x00400020(来自main)。这是一个快速修复添加到$sp$