Laboratorio di calcolatori elettronici
COMPITO C 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)Detti f={7,2,5,-9,1,4,6,2,0,4,-3,11,44,-19} i campioni di una funzione nei punti 1,2,3,...,14, costruisca e visualizzi i valori della derivata per i primi 13 campioni.
(b)Calcoli e visualizzi la media del vettore delle derivate.
(c)Calcolare e visualizzare la somma algebrica delle differenze degli elementi di posizione simmetrica del vettore f.
SVOLGIMENTO:
.data
mess: .asciiz "\nDerivata: %d"
.align 2
mess_addr: .word mess
elem: .space 4
mess2: .asciiz "\nLa media è: %d"
.align 2
mess2_addr: .word mess2
media: .space 4
mess3: .asciiz "\nLa somma delle differenze dei simmetrici è: %d"
.align 2
mess3_addr: .word mess3
somma: .space 4
vett1: .word 7,2,5,-9,1,4,6,2,0,4,-3,11,44,-19
vett2: .space 52
.text
;PUNTO A
addi r3,r0,13 ;contatore per i 13 elementi della derivata (NB mi fermo al 13esimo elemento
;poichè il 14esimo non ha successivo)
addi r2,r0,0 ;spiazzamento di vett1 e vett2
;calcolo della derivata:
; f(x2)-f(x1)
; -----------
; x2 - x1
;poichè x2-x1 è sempre 1 la derivata sarà f(x2)-f(x1)
loop_crea_der:
addi r4,r2,4 ;metto in r4 lo spiazzamento per caricare l'elemento successivo f(x2)
lw r5,vett1(r2) ;carico l'elemento attuale (i esimo) f(x1)
lw r6,vett1(r4) ;carico l'elemento successivo (i+1 esimo) f(x2)
sub r7,r6,r5 ;eseguo la differenza f(x2)-f(x1)
sw vett2(r2),r7 ;tale differenza è la derivata che memorizzo in vett2
sw elem(r0),r7 ;la memorizzo in elem affinchè la derivata corrente possa essere stampata
addi r14,r0,mess_addr ;passo ad r14 l'indirizzo del messaggio da stampare
trap 5 ;stampo
addi r2,r2,4 ;incremento lo spiazzamento
subi r3,r3,1 ;decremento il contatore
bnez r3,loop_crea_der ;se r3 non è zero cicla
;FINE PUNTO A
;PUNTO B
addi r2,r0,0 ;resetto r2 a zero, userò r2 come spiazzamento di vett2
addi r3,r0,13 ;resetto r3 a 13, userò r3 come contatore di vett2
addi r8,r0,0 ;resetto a zero r8, in r8 metterò la somma degli elementi di vett2
loop_somma:
lw r4,vett2(r2) ;carico l'iesimo elemento in r4
add r8,r8,r4 ;(*)lo sommo al contenuto del registro r8
addi r2,r2,4 ;incremento lo spiazzamento
subi r3,r3,1 ;decremento il contatore
bnez r3,loop_somma ;se r3 non zero cicla
;(*) NB: si sarebbe potuta inglobare l'istruzione nel ciclo precedente
; sostituendo ad r4 r7. In questo modo avremmo evitato di ciclare 2 volte il
;vettore. E' stato fatto così per distinguere i punti del compito
addi r9,r0,13 ;metto in r9 il valore 13
div r7,r8,r9 ;divido la somma degli elementi del vettore per r9==13
sw media(r0),r7 ;in r9 ho la media che metto in media per stampare a video
addi r14,r0,mess2_addr ;passo in r14 l'indirizzo del messaggio da stampare
trap 5 ;stampo
;NB: la media è stata considerata come un intero, poichè non espressamente
;richiesto di usare l'aritmetica double
;FINE PUNTO B
;PUNTO C
addi r2,r0,0 ;resetto r2 a zero, lo userò come spiazzamento per la prima metà di vett1
addi r3,r0,52 ;resetto r3 a 52, lo userò come spiazzamento per la seconda metà di vett2
;partendo però dalla coda di vett1 che ha spiazzamento 52
addi r4,r0,7 ;metto in r4 il contatore per vett1. tale contatore deve essere metà della
;dimensione di vett1, poichè dobbiamo sottrarre a coppie gli elementi simmetrici
addi r8,r0,0 ;resetto r8 a zero che conterrà la somma delle differenze dei simmetrici
loop_somma_simm:
lw r5,vett1(r2) ;carico in r5 l'iesimo elemento
lw r6,vett1(r3) ;carico l'iesimo elemento in coda. (cioè 14-i)
sub r7,r5,r6 ;eseguo la sottrazione tra gli elementi appena caricati
add r8,r8,r7 ;e sommo la loro differenza ad r8
addi r2,r2,4 ;incremento lo spiazzamento per la testa del vettore
subi r3,r3,4 ;decremento lo spiazzamento per la coda del vettore
subi r4,r4,1 ;decremento il contatore
bnez r4,loop_somma_simm ;se r4 non è zero cicla
sw somma(r0),r8 ;metti in somma il contenuto di r8 per stampare a video
addi r14,r0,mess3_addr ;passa ad r14 l'indirizzo del messaggio da stampare
trap 5 ;stampa
trap 0 ;fine programma