私は、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
しかし、正しい数値に近づいていますが、まだ間違った値を返しています。