2016-10-13 52 views
0

有人可以用這個將我推向正確的方向嗎?我試圖以mips複製這個c函數:遞歸mips函數的奇數值

我期待返回值被存儲在$ v0中,並在函數調用後輸出該值。功能現在在$ V0存儲5當我打電話與C功能(5,2),其餘期望爲13,而不是5

int C(int n, int k) { 
    if (k == 0) { 
     return 1; 
    } else if (n == k){ 
     return 1; 
    } else if (n < k){ 
     return 0; 
    } else { 
     return C(n, k-1) + C(n-1, k); 
    } 
} 

,這是MIPS彙編代碼,我有

c: 
# $a0 = n, $a1 = k 
    addi $sp, $sp, -12 
    sw $ra, 0($sp) 
    sw $s0, 4($sp) 
    sw $s1, 8($sp) 

    add $s0, $a0, $zero #s0 = n 
    add $s1, $a1, $zero #s1 = k 

    addi $t1, $zero, 1 
    beq $s1, $zero, return1 
    beq $s0, $s1, return1 
    blt $s0, $s1, return0 

    add $a0, $s0, $zero 
    addi $a1, $s1, -1 

    jal c 

    add $s1, $zero, $v0 # $s1 = c(n,k-1) 

    addi $a0, $s0, -1 
    add $a1, $s1, $zero 

    jal C#$v0 = c(n-1, k) 

    add $v0, $v0, $s1 

    exitc: 

     lw $ra, 0($sp) #read from stack 
     lw $s0, 4($sp) 
     lw $s1, 8($sp) 
     addi $sp, $sp, 12 
     jr $ra 

    return1: 
     li $v0, 1 
     j exitc 
    return0: 
     li $v0, 0 
     j exitc 

回答

1

您將要以相反的順序做這兩add S:

add $s1, $zero, $v0 # $s1 = c(n,k-1) 

addi $a0, $s0, -1 
add $a1, $s1, $zero 

否則你的第二個電話會C(n-1, C(n,k-1))而不是C(n-1, k)