[Assembly] Mips, prodotto scalare matrice vettore
Buongiorno, sto scrivendo un programmino in Assembly per processori Mips che calcola il prodotto scalare tra una matrice quadrata di ordine 10 ed un vettore a 10 elementi...la matrice la creo sommando l'indice di riga e colonna(es. la prima riga sarà: 0 1 2 3 4 5 6 7 8 9 ) e il vettore sulla stessa lunghezza d'onda lo creo da 1 a 10...ora ho scritto tutto il codice che funziona quasi a meraviglia...se non che calcolando i prodotti estraendo gli elementi da matrice e vettore non so per quale assurdo motivo dalla matrice come primo elemento estrae un 4 non uno 0...quindi mi sbaglia tutti iconti..ecco il codice:
Per semplicità ometto le routine di stampa che funzionano..il problema si presenta a livello del codice che comincia con l'etichetta "pr_scalare" e precisamente all'istruzione di " lw $t6, matrice($t2) " estrae un 4 invece di uno zero!! ...
Qualcuno riesce ad aiutarmi a capire dove sbaglio?
Grazie mille a tutti
.data prodotto: .word 10 vettore: .word 10 # definizione numero elementi del vettore nrig: .word 10 # definizione del valore del numero di righe della matrice ncol: .word 10 # definizione del valore del numero di colonne della matrice matrice: .word 0:100 # definizione dell'area di memoria che conterrà la matrice -- (100 words inizializzate col valore 0) spazio: .asciiz " " acapo: .asciiz "\n" .text .globl __start ###################################################################################### #USO I REGISTRI $S0, $S1, $S2, $s4 PER FAR RIFERIMENTO AL VETTORE; #USO I REGISTRI $t0, $t1, $t2,$t3, $t4,$t5 PER FAR RIFERIMENTO ALLA MATRICE; ###################################################################################### ##CREA MATRICE __start: li $t0,0 # in $t0 viene posto l'indice di riga i che assume valori da 0 a 9 li $t1,0 # in $t1 viene posto l'indice di colonna j che assume valori da 0 9 li $t2,0 # in $t2 viene posto l'indice k utilizzato per lo scorrimento delle locazioni di memoria lw $t3,nrig # numero totale di righe in $t3 lw $t4,ncol # numero totale di colonne in $t4 ciclo: add $t5, $t0, $t1 #t5=i + j sw $t5, matrice($t2) #scrivo i+j nella prima casella della matrice addi $t2, $t2, 4 #indirizzamento al byte addi $t1, $t1, 1 #incremento j, colonna successiva blt $t1, $t4, ciclo #se la nuova colonna è < delle colonne totali ripeti il ciclo li $t1, 0 #altrimenti poni a 0 l'indice di colonna addi $t0,$t0,1 #passa alla riga successiva blt $t0, $t3, ciclo #e se la riga successiva è minore del totale ripeti il ciclo jal stampa_matrice la $a0, acapo #stampo un "a capo" prima di calcolare il vettore li $v0, 4 syscall ##CREA VETTORE #vett: li $s0, 0 li $s1, 0 lw $s2, vettore crea_vettore: addi $s4, $s0, 1 sw $s4, vettore($s1) addi $s1, $s1, 4 #incremento indice di memoria addi $s0, $s0, 1 #incremento indice blt $s0, $s2, crea_vettore jal stampa_vettore la $a0, acapo #stampo un "a capo" prima di calcolare il vettore li $v0, 4 syscall li $s0, 0 #azzero s0 li $t5, 0 #registro risultato li $t0, 0 #azzera contatore righe li $t1, 0 #azzera contatore colonne li $s1, 0 #punta al primo elemento del vettore li $t2, 0 #punta al primo elemento della matrice li $t9,10 #contatore d'appoggio pr_scalare: lw $t7, vettore($s1) #carico il primo elemento del vettore lw $t6, matrice($t2) #carico il primo elemento della 1 riga della matrice mul $t5, $t6, $t7 #moltiplico.. add $s5, $s5, $t5 addi $s1, $s1, 4 #..... addi $t2, $t2, 4 #..... addi $t9, $t9, -1 #decr. contatore d'appoggio bgt $t9, $zero,pr_scalare sw $s5, prodotto($s7) #scrivo il risultato nel vettore prodotto addi $s7, $s7, 4 #indirizzamento al byte... addi $s0, $s0, 1 #incremento contatore risultato # addi $t1, $t1, 1 #passo alla colonna dopo addi $s1, $s1, 4 #..... addi $t2, $t2, 4 #..... blt $s0, 10, pr_scalare jal stampa_prodotto j esci
Per semplicità ometto le routine di stampa che funzionano..il problema si presenta a livello del codice che comincia con l'etichetta "pr_scalare" e precisamente all'istruzione di " lw $t6, matrice($t2) " estrae un 4 invece di uno zero!! ...
Qualcuno riesce ad aiutarmi a capire dove sbaglio?
Grazie mille a tutti
