-

[PROBLEMA] Assembly-Mips Prodotto scalare matrice vettore

#1
Buonasera, 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
 

Discussioni Simili


Entra