[Assembly] Mips, moltiplicazione valori grandi
buonasera,
sto scrivendo un programma che mi calcoli il prodotto scalare fra 2 vettori di cui 1 è in memoria e l'altro si crea in modo incrementale con un ciclo(1,2,3,4,5,6,7,8,9,10) sono 2 vettori a dieci elementi ciascuno. Ora il programma funziona, ma ho un problemone quando le componenti del vettore in memoria sono numeri molto grandi (es. 3000000000, 40000000000,200000000,ecc ecc), ovvero la moltiplicazione con cui moltiplico le singole componenti mi restituisce numeri sballati(> di 32 bit). So che esistono le mflo (copia il contenuto di LO in un registro) e mfhi (lo stesso ma con HI) ma non so come scrivere una serie di istruzioni che mi consentano di gestire l'overflow e di stampare numeri grandi..qualcuno ha qualche suggerimento? grazie!
sto scrivendo un programma che mi calcoli il prodotto scalare fra 2 vettori di cui 1 è in memoria e l'altro si crea in modo incrementale con un ciclo(1,2,3,4,5,6,7,8,9,10) sono 2 vettori a dieci elementi ciascuno. Ora il programma funziona, ma ho un problemone quando le componenti del vettore in memoria sono numeri molto grandi (es. 3000000000, 40000000000,200000000,ecc ecc), ovvero la moltiplicazione con cui moltiplico le singole componenti mi restituisce numeri sballati(> di 32 bit). So che esistono le mflo (copia il contenuto di LO in un registro) e mfhi (lo stesso ma con HI) ma non so come scrivere una serie di istruzioni che mi consentano di gestire l'overflow e di stampare numeri grandi..qualcuno ha qualche suggerimento? grazie!

Risposte
Che cosa intendi con stampare? Stampare a video sulla console? Altro? Per gestire l'overflow è sufficiente estrarre il risultato usando le istruzioni che hai scritto e poi metterle in due registri diversi.
Si stampare sulla console. Riporto la porzione di codice.
prodotto_v: lw $t7, vettore($s1) #carico il primo elemento del vettore 1 lw $t6, vettore2($s3) #carico il primo elemento del secondo vettore mul $t5, $t6, $t7 #moltiplico... addi $s1, $s1, 4 #incremento indice indirizzamento addi $s3, $s3, 4 #incremento indice indirizzamento addi $t9, $t9, -1 #decr. contatore d'appoggio sw $t5, prodotto($s7) #scrivo il risultato nella prima casella del vettore scalare risultato addi $s7, $s7, 4 #incremento indice indirizzam. vettore risultato bgt $t9, $zero,prodotto_v #finchè t9 > 0 ripeto tutto jal stampa_prodotto la $a0, spazio2 li $v0, 4 syscall li $s7, 0 #azzero indice indirizzamento li $t0, 0 #registro d'appoggio li $t1, 0 #registro che conterrà il prodotto scalare li $t2, 10 #contatore d'appoggio prod_scalare: lw $t0, prodotto($s7) #carico primo elemento del vettore dei prodotti add $t1, $t1, $t0 #t1 conterra' il valore del prodotto scalare----> sommo in maniera incrementale sub $t2, $t2, 1 #decremento il contatore t2 addi $s7, $s7, 4 #elemento successivo vettore prodotto bgtz $t2, prod_scalare #se il contatore d'appoggio è maggiore di zero somma l'elemento successivo move $a0, $t1 #se gli elementi sono finiti, stampa il prodotto scalare li $v0, 1 syscall j esci
L'unico modo che ho in mente per stampare un numero a 64 bit su console è di convertirlo in stringa e stampare quella. In effetti anche cercando su internet non ho trovato metodi per stampare interi a 64 bit, solo a 32.. Ma sei certo di aver bisogno di gestire anche valori così grandi? Non è che ti stai complicando la vita?
P.S. Per esempio qui non si trova nulla per farlo. Potresti al massimo stampare il numero in esadecimale, stampando hi e lo separatamente..
P.S. Per esempio qui non si trova nulla per farlo. Potresti al massimo stampare il numero in esadecimale, stampando hi e lo separatamente..
sono stato bocciato all'esame proprio perchè non riuscivo a farlo...allora non è che sono proprio l'ultimo degli stupidi...non è una cosa cosi' immediata....stampandolo in hex come dovrei fare? HI cosa contiene fondamentalmente e LO?
Sono tutt'altro che esperto in assembly MIPS. È possibile che ci sia un modo e che l'abbia spiegato a lezione. Io credo che dovresti chiedere al tuo professore se non ti è chiaro come avresti dovuto scrivere il programma. Ma se devi poter gestire numeri grandi, allora è necessario anche usare interi a 64 bit per i risultati (anche quelli intermedi).
grazie! credo che seguiro' il tuo consiglio! Buona giornata
