# esercizio2.s # chiede un numero e calcola il suo fibonacci con due algoritmi # poi mostra il risultato se concorde oppure segnala l'errore # in ogni caso riprende da capo chiedendo un altro numero # NB. andando avanti all'infinito la funzione main non si pone # il problema di rispettare le convenzioni sui registri per il chiamante .text .globl main # stampa il prompt e legge un numero main: li $v0,4 la $a0,intPrompt syscall li $v0,5 syscall sw $v0,n # calcola fibonacci ricorsivamente move $a0,$v0 jal fib_ric sw $v0,result # calcola fibonacci iterativamente lw $a0,n jal fib_iter # mostra il risultato se uguale oppure errore lw $t0,result bne $v0,$t0,err li $v0,4 la $a0,resPrompt syscall li $v0,1 move $a0,$t0 syscall j main err: li $v0,4 la $a0,resError syscall j main # soluzione ricorsiva # 12($sp) $ra # 8($sp) n # 4($sp) fib(n-1) fib_ric: li $v0,1 ble $a0,1,fib_rbase subu $sp,$sp,16 sw $ra,12($sp) sw $a0,8($sp) subu $a0,$a0,1 jal fib_ric # calcola fib(n-1) sw $v0,4($sp) lw $a0,8($sp) subu $a0,$a0,2 jal fib_ric # calcola fib(n-2) lw $t0,4($sp) addu $v0,$t0,$v0 # fib(n) = fib(n-1) + fib(n-2) lw $ra,12($sp) addu $sp,$sp,16 fib_rbase: jr $ra # soluzione iterativa # Calcolo tutti i numeri di fibonacci fino ad n # t0 fib(n-2) # t1 fib(n-1) # v0 fib(n) fib_iter: li $v0,1 ble $a0,1,fib_ibase move $t1,$v0 fib_iloop: move $t0,$t1 move $t1,$v0 addu $v0,$t0,$t1 # fib(n) = fib(n-1) + fib(n-2) subu $a0,$a0,1 bgt $a0,1,fib_iloop fib_ibase: jr $ra .data n: .word 0 result: .word 0 intPrompt: .asciiz "\nInserisci un numero: " resPrompt: .asciiz "Risultato: " resError: .asciiz "Errore"