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