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
Codice: Download
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