|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
[Pseudo assembler] media di un vettore
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:
stato dello stack: #0 R2 #4 R1 #8 R0 #12 RETADDRESS #16 LA #20 LNESAMI #24 LMEDIA 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? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
su
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:23.