|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Prodotto tra interi a 64bit
Sto utilizzando Assembly MIPS, ma la mia è una domanda più che altro di carattere generale. Devo fare il prodotto tra due interi a 64 bit, quindi salvati ciascuno in due registri a 32bit (facciamo per esempio che uno sia in $a0,$a1 e l'altro in $a2,$a3, dove il numero del registro più basso indica che vi è la parte meno significativa del numero). So che per trovare il prodotto devo fare:
Codice:
$v0=LO(a0*a3) $v1=HI(a0*a2)+LO(a1*a2)+LO(a0*a3) |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
nessuno?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non conosco adeguatamente l'architettura MIPS, ma probabilmente con questo risolvi: https://bytes.com/topic/c/answers/21...multiplication
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Grazie! Comunque la mia è una domanda un po' generica, non proprio soltanto dell'archtettura MIPS.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
OK, allora potresti spiegare prima cosa intendi con questo:
LO(a0*a3) ? Se LO è un registro che contiene la parte bassa del risultato di una moltiplicazione, non capisco che ruolo abbia nell'espressione che hai usato, visto che a0*a3 dovrebbe rappresentare il prodotto di quei due registri.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
OK. Allora partiamo dallo pseudocodice di quello che devi eseguire. Ho trovato un post semplice qui che descrive la classica operazione di moltiplicazione a precisione più elevata, sfruttando 4 istruzioni di moltiplicazione a metà precisione:
Codice:
A2A1
x B2B1
----------
B1A1
+ B1A2
+ B2A1
+ B2A2
----------
C4C3C2C1
Supponendo che siano tutti registri a 32-bit, B1A1 lo devi tradurre nell'istruzione MIPS di moltiplicazione 32x32 (senza segno), che produrrà i risultati in LO e HI. Al primo passo semplicemente li conserverai LO in C1 (che rimarrà tale) e HI in C2, mentre mettera che devono contenere il risultato finale, a 128-bit, dell'operazione di moltiplicazione. Per il secondo passo ti consiglierei di calcolare B2A2, copiando poi LO in C3 e HI in C4. A questo punto devi eseguire i due prodotti intermedi, e sommare i risultati a C2 con somma semplice, a C3 con somma con riporto (che può provenire dalla precedente somma), e sommare zero + riporto (che può provenire dalla precedente somma) a C4. Penso sia tutto. Ovviamente la stessa cosa vale per la moltiplicazione 128x128 -> 256 bit.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:42.




















