2

私は、function1 内で次の数学演算を実行する再帰的な MIPS アセンブリ プログラムを作成する任務を負っています。

(-3)*function1(n-2) + 7*function1(n-3) + 15

プログラムは c でモデル化されています。

 // The function1 is a recursive procedure defined by:
// function1(n) = 1 if n <= 2
// = (-3)*function1(n-2) + 7*function1(n-3) + 15 otherwise.
int function1(int n)
{
 if (n <= 2)
 {
 return 1;
 }
 else
 {
 int comp = (-3)*function1(n-2) + 7*function1(n-3) + 15;
 return comp;
 }
}
// The main calls function1 by entering an integer given by a user.
void main()
1 of 2{
 int ans, n;
 printf("Enter an integer:\n");
 // read an integer from user and store it in "n"
 scanf("%d", &n);
 ans = function1(n);
 // print out the solution computed by function 1
 printf("The solution is: %d\n", ans);
 return;
}

コンパイルして正常に実行されるコードを作成しましたが、正しくない値が返されます。

 .data
mes1:   .asciiz "\nEnter an integer: "
mes2:   .asciiz "The solutinon is: "

.text
    .globl main

main:
    #Display message
    la $a0, mes1
    li $v0, 4
    syscall
    #Retrieve Value
    li $v0, 5
    syscall
    #Store value into $a0 and jump to function1
    move $a0, $v0
    jal function1

    #Store return value to $t0
    move $t0, $v0

    #Display solution
    la $a0, mes2
    li $v0, 4
    syscall
    move $a0, $t0
    li $v0, 1
    syscall

    #End
    li $v0, 10
    syscall



function1:
    #Store return address
    addi $sp, $sp, -4
    sw $ra, 0($sp)

    #Store $a0 to stack
    addi $sp, $sp, -4
    sw $a0, 0($sp)

    #If($a0<3):$t0=1:$t0=0
    slti $t0, $a0, 3

    #if($t0=0):math
    beq $t0, $zero, math
    addi $v0, $zero, 1

    #Retrieve from stack
    lw  $a0, 0($sp)
    addi    $sp, $sp, 4
    lw  $ra, 0($sp)
    addi    $sp, $sp, 4

    jr $ra

math:
    addi $a0, $a0, -2
    jal function1
    mul $s0 $v0, -3
    addi $a0, $a0, -3
    jal function1
    mul $s1, $v0, 7
    add $s1, $s0, $s1
    addi $v0, $s1, 15

    #Retrieve from stack
    lw  $a0, 0($sp)
    addi    $sp, $sp, 4
    lw  $ra, 0($sp)
    addi    $sp, $sp, 4

    jr $ra

6 を入力すると 91 が出力されるはずですが、現在は 44 が出力されています。おそらくさらに当惑するのは、任意の値を入力すると、出力数値が常に 4 で割り切れるということです。違う。誰でもアドバイスできますか?

-編集-

$a0 の保護に関する @Tomás Badan のコメントを考慮しました。私は試した:

math:
    #Store $a0 to stack
    addi $sp, $sp, -4
    sw $a0, 0($sp)

    addi $a0, $a0, -2
    jal function1
    mul $s0, $v0, -3

    #Retrieve from stack
    lw  $a0, 0($sp)
    addi    $sp, $sp, 4

    addi $a0, $a0, -3
    jal function1
    mul $s1, $v0, 7
    add $s1, $s0, $s1
    addi $v0, $s1, 15

    #Retrieve from stack
    lw  $a0, 0($sp)
    addi    $sp, $sp, 4
    lw  $ra, 0($sp)
    addi    $sp, $sp, 4

    jr $ra

しかし、正しい数値に近づいていますが、まだ間違った値を返しています。

4

1 に答える 1