compitoA28.s
Laboratorio di calcolatori elettronici
COMPITO A del 28 Giugno 2004
Proff. V.Catania - risoluzione e commenti di Ignazio Coco
esportato con SciTE
Testo del compito:
Utilizzando l'assembly del DLX scrivere un programma che:
(a) Calcoli e visualizzi la media pesata del vettore vett={1,7,2,5,4,3,9,3} utilizzando come pesi gli elementi
del vettore pesi={2,1,3,5,1,4,2,8}
[cioè: (vett[0]*pesi[0]+vett[1]*pesi[1]+...+vett[7]*pesi[7])/(pesi[0]+pesi[1]+...+pesi[7])].
(b) Visualizzare gli elementi di vett contemporaneamente dispari e diversi da 5.
(c) Visualizzare i minimi relativi del vettore vett.
SVOLGIMENTO:
.data
mess: .asciiz "\nLa media pesata è %d"
.align 2
mess_addr:
.word mess
elem: .space 4
mess2: .asciiz "\nElemento %d"
.align 2
mess2_addr:
.word mess2
elem2: .space 4
mess3: .asciiz "\nMinimo relativo: %d"
.align 2
mess3_addr:
.word mess3
elem3: .space 4
vett: .word 1,7,2,5,4,3,9,3
pesi: .word 2,1,3,5,1,4,2,8
.text
;PUNTO A
addi r2,r0,0 ;spiazzamento per vett
addi r3,r0,8 ;contatore a decremento per vett
addi r7,r0,0 ;conterrà la somma degli elementi moltiplicati per rispettivo peso
addi r8,r0,0 ;contiene la somma dei pesi
somma_media:
lw r4,vett(r2) ;carico l'iesimo elemento
lw r5,pesi(r2) ;carico l'iesimo peso
mult r6,r4,r5 ;li moltiplico
add r7,r7,r6 ;aggiungo il risultato al registro somma R7
add r8,r8,r5 ;sommo ad r8 il peso corrente
addi r2,r2,4 ;incremento lo spiazzamento
subi r3,r3,1 ;decremento il contatore
bnez r3,somma_media ;cicla se R3 non è zero (fine vettore)
div r4,r7,r8 ;divido somma_pesi*elementi per somma dei pesi. In r4 ho quindi la media pesata
sw elem(r0),r4 ;memorizzo in elem la media, affinchè venga stampata a video
addi r14,r0,mess_addr ;metto in r14 l'indirizzo della stringa da stampare
trap 5 ;stampo
;FINE PUNTO A
;PUNTO B
addi r2,r0,0 ;resetto r2 a zero, lo userò come spiazzamento su vett
addi r3,r0,8 ;riporto r3 ad 8, lo userò come contatore per vett
loop_vis:
lw r4,vett(r2) ;carico l'iesimo elemento di vett in r4
seqi r5,r4,5 ;setta r5 ad 1 se r4=5
bnez r5, goa ;se r5 non è zero vai a goa (cioè alla fine del ciclo, salto la sezione della stampa)
andi r5,r4,1 ;setto r5 ad 1 se r4 è dispari
beqz r5,goa ;se r5=0 (cioè r4 è pari) vai a goa (non stampo r5)
sw elem2(r0),r4 ;altrimenti metto r4 in elem affinchè venga stampato
addi r14,r0,mess2_addr ;metto in r14 l'indirizzo della stringa da stampare
trap 5 ;la stampo
goa:
addi r2,r2,4 ;incrementa lo spiazzamento
subi r3,r3,1 ;decrementa il contatore
bnez r3,loop_vis ;se il contatore non è zero cicla
;PUNTO FINE B
;PUNTO C
addi r2,r0,4 ;setto r2 a 4 ovvero inizio la ricerca dei minimi relativi dal secondo elemento
addi r3,r0,6 ;il contatore a 6 perchè escludo la ricerca del minimo relativo sia nel primo che nell'ultimo
;elemento
loop_min:
subi r4,r2,4 ;in r4 metto lo spiazzamento per l'elemento precedente
addi r5,r2,4 ;in r5 metto lo spiazzamento per l'elemento successivo
lw r6,vett(r4) ;carico in r6 l'elemento precedente
lw r7,vett(r2) ;carico in r7 l'elemento attuale
lw r8,vett(r5) ;carico in r8 l'elemento successivo
slt r10,r7,r6 ;setto r10 ad 1 se r7<r6
slt r11,r7,r8 ;setto r11 ad 1 se r7<r8
and r12,r10,r11 ;controllo che le condizioni precedenti siano entrambe vere e setto r12 ad 1
beqz r12,no_min ;se r12=0 salto a no_min, vuol dire che r7 non è un minimo relativo
sw elem3(r0),r7 ;altrimenti r7 è un minimo relativo,metto in elem3 r7 affinchè possa stamparlo
addi r14,r0,mess3_addr ;setto r14 con l'indirizzo del messaggio da stampare
trap 5 ;stampo
no_min:
addi r2,r2,4 ;incremento lo spiazzamento
subi r3,r3,1 ;decremento il contatore
bnez r3,loop_min ;se r3 non è zero cicla
trap 0 ;fine programma