[Assembly] Mips, moltiplicazione valori grandi

frab1
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! :roll:

Risposte
apatriarca
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.

frab1
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

apatriarca
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..

frab1
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?

apatriarca
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).

frab1
grazie! credo che seguiro' il tuo consiglio! Buona giornata ;-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.