Я не могу точно понять, что я делаю, я думаю, что, может быть, чего-то не хватает.
Мне нужно написать последовательность Фибоначчи длиной n-й раз через пользовательский ввод (итеративный метод).
Например, если пользовательский ввод 6:
вывод будет:
5
0, 1, 1, 2, 3, 5
Мне дали псевдокод для расчета фибоначчи:
fib(n):
a = 0
b = 1
for i from 0 to n - 1:
array [i] = a
temp = b
b += a
a = temp
Вот что я придумал:
.data
fib: .space 100
fib_size: .word 100
title: .asciiz "Calculating the fibonacci sequence \n"
prompt: .asciiz "Insert the nth fibonacci sequence f(n): "
output: .asciiz "The result is: "
.text
.globl main
main:
la $t1, fib #loading addresses
la $t2, fib_size
lw $t2, 0($t2) #load array size value to t1
la $a0, title
li $v0, 4 #print the title
syscall
la $a0, prompt #print the prompt
li $v0, 4
syscall
li $v0, 5 #read the input
syscall
move $s0, $v0 #store the input into register $s0; n variable; $s0 = $v0
addi $s0, $s0, -1
li $s1, 0 #a = 0
li $s2, 1 #b = 1
li $s3, 0 #temp = initialized to 0
li $s4, 0 #i = 0
fib_loop:
slt $t3, $0, $s4 #i > 0
slt $t4, $s4, $s0 #i < n - 1
and $t3, $t3, $t4 #i > 0 && i < n -1
beq $t0, $0, end_loop #if fails, end the loop
sw $s1, 0($t2) # array[i] = a ; store a in array position of fib_size
addu $t2, $t2, 4 # increase the array position by 1
move $s3, $s2 #temp = b
addu $s2, $s2, $s1 #b = b + a
move $s1, $s3 #a = temp
j fib_loop #loop
end_loop:
la $t1, fib
la $a0, output #print the output
li $v0, 4
syscall
lw $a0, -4($t2) #grab the word from the last position of the array
li $v0, 1 #print the integer (nth of our fibonacci sequence)
syscall
output_loop:
slt $t5, $t1, $t2 #if fib @ 0 < fib_size @ whatever position it reaches on input loop
beq $t5, $0, exit_output_loop #if fails, exit the loop
lw $a0, 0($t1) #get integer from fib[0]
li $v0, 1 #print integer
syscall
li $a0, ',' #print the comma
li $v0, 11
syscall
li $a0, ' ' #print the space char
li $v0, 11
syscall
addu $t0, $t0, 4 #increment the fib array position by 1
j output_loop
exit_output_loop:
li $v0 10 #exit
syscall
edit: исправлены проблемы с sw. Теперь я получил ошибки во время выполнения? "lw $ a0, -4 ($ t2)"