MIPS на чтение ввода по Фибоначчи (итеративный)? - PullRequest
0 голосов
/ 18 марта 2019

Я не могу точно понять, что я делаю, я думаю, что, может быть, чего-то не хватает.

Мне нужно написать последовательность Фибоначчи длиной 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)"

...