Junior Member
Iscritto dal: Oct 2013
Messaggi: 1
|
[ASSEMBLY - MIPS] Prodotto scalare matrice vettore piccolo problema
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
Codice:
.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
|