Я пытаюсь реализовать программу, в которой задан пользовательский ввод (n), и программа будет следовать этому алгоритму:
if n = 0, f(n) = 2
else if n is odd, f(n) = 3*f(n-1) + 1
else if n is even, f(n) = f(n-2) + 2*f(n-1)
Вот моя попытка сделать это до сих пор:
.data 0x1001000C
.word 4
prompt2: .asciiz "Result: "
answer: .word 0
.text
lui $t0,0x1001
lw $a0,0xC($t0) #n
sw $v1,0x4($t0)
addi $t8, $t8, 1
jal function
add $v1,$s1,$v1
sw $v1,answer
# Print out the result
li $v0,4
la $a0,prompt2
syscall
lw $a0,answer
li $v0,1
syscall
li $v0,10
syscall
function:
beq $a0, $0, f_exit #if n=0
andi $t9, $a0, 1
beq $t9, $t8, f_odd #if odd
addi $sp,$sp,-8 # push stack
sw $ra,4($sp) # store return address
sw $a0,0($sp) # save n
addi $a0, $a0, -1 #n-1
jal function
mul $v1, $v1, 2 #2f(n-1)
lw $v1,0x4($t0)
lw $a0,0($sp) # reload 1st operand
addi $a0, $a0, -2 #n-2
jal function
lw $ra,4($sp) # restore return address
lw $a0,0($sp) # restore n
addi $sp,$sp,8
j exit
f_odd:
addi $sp,$sp,-8 # push stack
sw $ra,4($sp) # store return address
sw $a0,0($sp) # save n
addi $a0, $a0, -1 #n-1
jal function
mul $v1,$v1,3 #3f(n-1)
addi $s1, $v1, 1 #3f(n-1)+1
lw $v1,0x4($t0)
lw $a0,0($sp) # reload 1st operand
lw $ra,4($sp) # restore return address
lw $a0,0($sp) # restore n
addi $sp,$sp,8
j exit
f_exit:
addi $v1,$v1,2
exit:
jr $ra
Однако я никогда не мог получить правильный ввод.Например, ввод 4 должен дать мне вывод 98, но вместо этого эта программа дает мне 9. Любая помощь будет оценена.