lunedì 11 maggio 2015

A.S. 2014/15 - Relazione di laboratorio: MOLTIPLICAZIONE A 64BIT (PRECISIONE DOPPIA)

Autore: Todisco Loris, Classe: 4°G


Obiettivo: Il programma dovrà essere in grado di eseguire una moltiplicazione a 64 bit avendo in ingresso due dati a 32bit
Premesse Teoriche:
Abbiamo una CPU che lavora con dati a 32 bit, quindi per rappresentare un dato a 64 bit dovremo utilizzare due registri, quindi il principale problema sarà quello di ottenere un dato a 64bit e dividerlo in due registri da 32bit (32 + 32 = 64).

Specifiche:
-       Utilizzeremo 3 vettori: 2 in Rom contenti le costanti, ovvero gli operandi; 1 in Ram, il quale conterrà i risultati.
-       Utilizzeremo lo Stack pointer: Useremo lo stack per salvare dei registri che poi ci torneranno utili durante lo svolgimento del programma.
-       Creeremo una funzione che sarà in grado di eseguire la moltiplicazione richiesta.
IMPOSTAZIONE REGISTRI:
     
R7 = Indice Vet1 e Vet2
R0,R1 = Elementi correnti
R8= Indice Vet3
R4,R5 = Rispettivamente parti basse Ope1 e Ope2
R6,R7 = Rispettivamente parti alte Ope1 e Ope2
R10 = Puntatore vettore1,Operando,ROM
R11 = Puntatore vettore2,Operando,ROM
R12 = Puntatore vettore3,risultati,RAM
R3 = Risultato MSB
R2 = Risultato LSB
R7,R8,R9 Registri salvabili

SVILUPPO PROGETTO:

Questo schema rappresenta graficamente il programma che verrà eseguito, facendo riferimento al modo normale con la quale eseguiamo una moltiplicazione tra due semplici numeri.




Analisi e svolgimento:

Eseguiremo la moltiplicazione come se fosse una semplice moltiplicazione tra due numeri in colonna:

1)   Prima di tutto divido parte bassa e parte alta dei due operandi(il dato viene diviso in due, quindi avremo 2 dati a 16 bit per ogni operando,MSB E LSB), questo viene fatto perchè eseguiremo la moltiplicazione come se fosse una semplice operazione in colonna.

2)   Ora moltiplicheremo le due parti basse degli operandi e il risultato lo inseriremo in R2:

0900*4B40  = 02A5400 (esadecimale)

3)   Subito dopo moltiplicheremo la parte bassa del moltiplicatore(R5) per la parte alta del moltiplicando(R6), il risultato sarà in R9,si può notare che stiamo eseguendo l’operazione con il metodo specificato prima.

003D * 4B40 = 0011EE40(esadecimale)

4)   Moltiplico la parte bassa del moltiplicando(R4)  per la parte alta del moltiplicatore(R7), il risultato sarà R8.

0900*004C =0002AC00

5)   Estraggo la parte bassa dagli ultimi due risultati ottenuti(R8,R9) e gli shifto di 16 bit in modo da ottenerli come parte alta, una volta fatto questo li sommo in R2, ci stiamo dedicando alla parte bassa del risultato, se vi sarà riporto lo sommeremo alla parte alta, ovvero in R3.

R2 = 02A54000 + AC0000000 = AEA54000
R2 = AEA54000 + EE400000 = 9CE54000 <= R2
Dato che vi è un prestito nell’ultima operazione: R3 <= R3 + 1  = 00000001

6)   A questo punto dobbiamo occuparci della parte alta del risultato, R3.
Prima di tutto estrapoliamo la parte alta di R8 ed R9 e li sommiamo in R3,con eventuale carry.

R3 = 00000001 + 0000002=00000003
R3 =000000003 + 00000011= 00000014
Non vi è carry

7)   A questo moltiplichiamo la parte alta del moltiplicatore e quella alta del moltiplicando e sommiamo il tutto in R3, abbiamo finito il programma.

R6*R7 = 003D * 004C = 0000121C
R3 = 0000121C + 00000014 = 00001230 <= R3

Risultato finale: 000012309CE54000

CodiceDownload

Collaudo:  
Per verificare l’effettivo funzionamento del programma viene eseguito un test simile a quello sopra riportato, controllando se i risultati prodotti dalla macchina siano corretti attraverso una calcolatrice.


Nessun commento:

Posta un commento