2016-10-13 8 views
0

誰かが私にこれを正しい方向に押し込むことができますか?私はmipsでこのc関数を複製しようとしています:再帰的なmips関数の奇数値

戻り値が$ v0に格納され、関数呼び出し後にその値を出力しています。私は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(2~5)との関数を呼び出すとき機能は今の$ V0 5に格納されていますあなたが逆の順序でこれら2 add秒をしたいでしょう
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 $s1, $zero, $v0 # $s1 = c(n,k-1) 

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

そうでなければ、あなたの2番目の呼び出しはC(n-1, C(n,k-1))の代わりC(n-1, k)になります。