Testo
Sia dato un vettore A memorizzato a partire dalla locazione LA, di dimensione
non nota, che contiene i voti riportati agli esami da uno studente. I voti sono
valori positivi (tra 18 e 30), ciascuno dei quali occupa 1 byte, ed il valore 0 indica
la fine del vettore. Scrivere una subroutine in Assembler (commentata linea per
linea in modo leggibile) che scriva nella locazione di memoria LNESAMI il
numero di esami e nella locazione LMEDIA la media ottenuta. Si descriva anche
la situazione dello stack all’inizio della subroutine.
Il puntatore al vettore A, LA (cioè la locazione di memoria in cui è memorizzato il
primo numero intero), il puntatore LNESAMI alla variabile NESAMI (che contiene
il numero totale di esami sostenuti dallo studente) e il puntatore LMEDIA alla
variabile MEDIA (che contiene la media dei voti degli esami sostenuti dallo
studente) sono passati alla subroutine tramite lo stack, nell’ordine descritto. Si
supponga di avere a disposizione un’istruzione DIV in grado di operare su
numeri in virgola mobile e si considerino le variabili NESAMI e MEDIA espresse
in virgola mobile su 4 bytes. Nel caso lo studente non avesse sostenuto
nemmeno un esame, la sua media è pari a 0.
Ipotesi: i registri a disposizione sono R0, R1 ed R2, ciascuno dei quali presenta
una dimensione pari a 32 bit.
codice:
PUSH R0
PUSH R1
PUSH R2
MOVE #16(SP),R0 //in r0 carica il puntatore del vettore
CLEAR R2 //azzera r1 e r2
CLEAR R1
CMP (RO),#0 //controlla che nn sia stato dato nessun esame
BRANCH = 0 FINEERR //se è così salta a fineerr
loop: //ciclo
CMP (RO),#0 //controlla la fine del vettore
BRANCH = 0 FINE
ADD (RO),R1 // somma in r1 il contenuto di r0
ADD #1,R2 //incremetna il contatore
ADD #1,R0 //passa di cella
BRANCH LOOP //salta a loop
fineerr:
MOVE #0,(#24(SP)) //carica 0 nella media
POP R2
POP R1
POP R0
fine:
DIV R1,R2 // fa la divisione (nn ricordo l'ordine degli operandi)
MOVE R1,(#24(SP)) // sposta i valori nelle celle..
MOVE R2,(#20(SP))
POP R2
POP R1
POP R0
secondo voi è giusto?