NUM =, 5 DIM =, NUM, *, 4 SCONTO =, 30 ARROTONDA=1 .data prezzi: .word 39, 1880, 2394, 1000, 1590 scontati: .space DIM .text .globl main .ent main main: la $a0, prezzi la $a1, scontati li $a2, NUM li $a3, SCONTO li $t0, ARROTONDA subu $sp, 4 sw $t0, ($sp) jal calcola_sconto li $v0, 10 # codice per uscita dal programma syscall # fine .end main .ent calcola_sconto calcola_sconto: addiu $sp, $sp, -4 # crea spazio per lo stack sw $fp, ($sp) # memorizza frame pointer move $fp, $sp # il nuovo frame pointer è lo stack pointer precedente move $t0, $a0 # pointer prezzi move $t1, $a1 # pointer scontati sll $t2, $a2, 2 # moltiplica per 4 (stiamo lavorando con delle addu $t2, $t0, $t2 # pointer fine prezzi li $t5, 100 # fattore per dividere sub $t3, $t5, $a3 # fattore moltiplicativo lw $t4, 4($fp) # flag approssima move $v0, $0 # totale scontato loop: lw $t8, ($t0) # carica prezzo dalla memoria mul $t6, $t8, $t3 # moltiplica per fattore divu $t6, $t5 # dividi mflo $t6 # carica quoto beqz $t4, salva # salta al salvataggio se la flag arrotonda è zero mfhi $t7 # carica resto blt $t7, 50, salva # salta al salvataggio se il resto è minore di 50 addiu $t6, $t6, 1 # arrotonda per eccesso salva: sw $t6, ($t1) # salva in memoria subu $t6, $t8, $t6 addu $v0, $v0, $t6 # aggiorna totale addiu $t0, $t0, 4 # incrementa pointer prezzi addiu $t1, $t1, 4 # incrementa pointer scontati bne $t0, $t2, loop lw $fp, ($sp) # carica lo stack pointer salvato move $sp, $fp # ripristinalo addiu $sp, $sp, 4 # pop stack jr $ra .end calcola_sconto