2013-07-15 35 views
1

我似乎無法找到我的錯在我的算法,我的具體問題是,我似乎打印相同的值,在控制檯輸入的所有整數:這裏是我的代碼ASM語言:因子算法錯誤?

main: 

li $v0, 5 
syscall 
jal factorial 
li $v0, 10 
syscall 

factorial: 
    ###preamble### 
    subu $sp, $sp, 32 
    sw $ra, 28($sp) 
    sw $fp, 24($sp) 
    addu $fp, $sp, 32 
    sw $a0, 20($fp) 
    ###preamble### 

    lw $v0, 20($fp) 
    bgtz $v0, multiply 
    li $v0, 1 
    j end 

multiply: 
    lw $v1, 20($fp) 
    subu $v0, $v1, 1 
    move $a0, $v0 
    jal factorial 

    lw $v1, 20($fp) 
    li $t3, 0 
    li $t2, 1 
    b multi 

    multi: 
     beq $t2, $v0, endLOOP 
     add $t3, $t3, $v1 
     add $t2, $t2, 1 
     b multi 

    endLOOP: 
     move $v0, $t3 

end: 
    lw $ra, 28($sp) 
    lw $fp, 24($sp) 
    addu $sp, $sp, 32 
    move $a0, $v0 
    li $v0, 1 
    syscall 
    jr $ra 

在這代碼我似乎總是要打印的值爲10,而在我的第二個代碼,我總是得到一個11

main: 

li $v0, 5 
syscall 
jal factorial 
li $v0, 10 
syscall 

factorial: 
    ###preamble### 
    subu $sp, $sp, 32 
    sw $ra, 28($sp) 
    sw $a0, 24($sp) 
    li $v0, 1 
    ble $a0, $zero, end 
    b multiply 
    ###preamble### 

multiply: 
    addi $a0, $a0, -1 
    jal factorial 
    lw $a0, 24($sp) 
    b multi 
    multi: 
     beq $t2, $v0, endLOOP 
     add $t3, $t3, $a0 
     add $t2, $t2, 1 
     b multi 

    endLOOP: 
     move $v0, $t3 

end: 
    lw $ra, 28($sp) 
    addu $sp, $sp, 32 
    move $a0, $v0 
    li $v0, 1 
    syscall 
    jr $ra 

也請注意,我們不允許使用MULT功能,所以請不要問我爲什麼不使用它。謝謝您的幫助:d

回答

1

我看到一對夫婦與您的代碼的問題:

li $v0, 5
syscall
jal factorial

syscall 5(read_int)將在返回值$v0,所以當你第一次輸入factorial時,你會在$v0。您可以通過在jal之前將值移至$a0來解決該問題。


li $v0, 1
syscall
jr $ra

這是不是打印使階乘功能之外更有意義?由於$v0應該保持函數的返回值,可以考慮當你從factorial(2)返回factorial(3)會發生什麼事,你已經覆蓋$v0與值1

+0

我得到你的答案的第一部分,我的問題,但對第二個,我不太明白。但爲了讓我和你的事情變得更加容易,我只會問我如何在控制檯中打印factorial的最終值?我不太確定如何去做 –

+0

_「第二個,我不太明白」_:我在說你用值1覆蓋了返回值,這樣當你按照你的方式工作時通過遞歸鏈返回「out」,無論「n」是什麼,'factorial(n)'總是會從'factorial(n-1)'得到值1。我建議你在將_first_調用到'factorial'之後(即在'exit'' syscall'之前)移動print。 (我現在談論你的第一個實現,我沒有看第二個版本) – Michael

+0

哦,我明白了。該程序現在工作正常。感謝您的幫助! :d –