2014-09-24 97 views
0

我是MIPS的新手,並且正在嘗試編寫遞歸程序。該程序將計算f(N),其中N是一個大於零的整數。 f(N)= 3*(N-1)+f(N-1)+1。基本情況是f(0)=2。但是,當我嘗試運行我的程序時,它會無限期地運行,所以我猜測遞歸調用永遠不會結束。我似乎無法找到問題所在。我的代碼如下。MIPS遞歸程序

.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 

我真的很感謝任何幫助。謝謝!

+0

'F(n)'的函數在哪裏?不應該有一個調用它,因爲這是遞歸的? – jww 2014-09-27 03:49:47

回答

0

您忘記了在fastfunc過程結束時收縮堆棧。

就在jr $ra之前我加了addi $sp $sp 8,然後它就像預期的那樣開始停止。

0

您的退貨地址$ra正在加載0x00400050(來自factfunc)而不是0x00400020(來自main)。這是一個快速修復,添加到$sp$