^  Help Taison

Donazione Libera Paypal


compitoC28.s
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


print

Follow cesareino on Twitter
 
^  Twitter
 
^  Login





Lingua del sito:
deutsch english español français italiano português
 
^  Ads
Freely inspired to Mollio and DKBlog template