2014-09-13 68 views
-1

我試圖在MIPS彙編語言中實現斐波那契函數。我在下面寫了一些代碼,它在運行時執行時沒有任何錯誤,我可以在每次迭代中正確地看到$ a0中的n值。然而,擺在$ V0結果從未設置直到最後一次迭代,它返回2MIPS彙編中的斐波那契不會返回正確的答案

代碼:

data: 
    addi $a0, $zero, 10 

fib: 
    slti $t0, $a0, 2  # check n <= 1 
    beq $t0, $zero, body # if previous statement was false, continue procedure 
    addi $v0, $zero, 1 # else return 1 

    jr $ra    # return to body 


body: 
    addi $sp, $sp, -16 # make room for 4 registers in stack 
    sw $a0, 0($sp)  # save $a0 = n, to stack 
    sw $ra, 4($sp)  # save return address to stack 

    addi $a0, $a0, -1 # $a0 = n - 1 
    jal fib   # invoke fib(n-1) and save return address 

    sw $v0, 8($sp)  # $v0 = fib(n-1), save to stack 

    addi $a0, $a0, -1 # $a0 = n - 2 
    jal fib   # invoke fib(n-2) and save return address 

    sw $v0, 12($sp) # $v0 = fib(n-2), save to stack 

    lw $t0, 8($sp)  # $t0 = fib(n-1) 
    lw $t1, 12($sp) # $t1 = fib(n-2) 
    addi $sp, $sp, 16 # pop from stack 

    add $v0, $t0, $t1 # $v0 = fib(n-1) + fib(n-2) 

    syscall   # return 
+0

什麼是你的問題?哪一行沒有做你期望的? – 2014-09-13 15:26:26

+0

問題是,對於所有輸入> 2,終止時存儲在$ v0中的結果是2,並且我不確定確切的線 – Tarlen 2014-09-13 15:29:29

+0

那麼您需要調試更多。當你發現某條線路沒有達到你期望的水平時,請回來,我們可以提供幫助。 – 2014-09-13 15:31:50

回答

1

根據您的ABI,堆棧指針應指向第一針對在棧上,所以像

sw $a0, 0($sp)  # save $a0 = n, to stack 

線應儘量避免,以防程序被在中斷處理程序使用用戶堆棧的系統上中斷。

與您的代碼更重要的問題是這樣的函數返回的時候,它被稱爲與n>1

syscall   # return 

是完全錯誤的。你不要syscall回報!這是特別令人費解的,因爲您使用

jr $ra    # return to body 

正確在n<=1的情況下。

相反的syscall,你需要使用

lw $ra, 4($sp)  #restore link register 
addi $sp, $sp, 16 #restore stack pointer 
jr $ra    #return