62 lines
2.7 KiB
NASM
62 lines
2.7 KiB
NASM
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 |