PDA

Visualizza la versione completa : [ASSEMBLER] Stampa della matrice (MIPS)


Ainin92
07-07-2012, 14:10
Ciao a tutti!!! Sto fancedo un programma assembler MIPS che dopo aver inserito da tastiera il numero di righe e colonne, carica una matrice e la stampa a video. Per quanto riguarda il caricamento sembra funzionare, invece la stampa d i numeri (se ad sempio inserisco una matrice 3x3 : 1 2 3 4 5 6 7 8 9 mi stampa 1 2 7).
Questo il codice:


.data
riga: .asciiz "inserisci la riga: "
colonna: .asciiz "inserisci la colonna: "
mat: .asciiz "inserisci la matrice: "
spazio: .asciiz " "
acapo: .asciiz "\n"
strout: .asciiz "matrice: "
.text
.globl main

main:

la $a0,riga #
li $v0,4 #printf("inserisci la riga: ");
syscall #

li $v0,5 #scanf("%d",&riga);
syscall #

move $s1,$v0

la $a0,colonna #
li $v0,4 #printf("inserisci la colonna: ");
syscall #

li $v0,5 #scanf("%d",&colonna);
syscall #

move $s2,$v0

la $a0,mat #
li $v0,4 #printf("inserisci la matrice: ");
syscall #


move $t0,$zero #i=o

lui $s0,0x1000 #base matrice

#inizio del for per acquisire i dati

loop_for_lettura:

slt $t2,$t0,$s1 #se i<riga t2=1
beq $t2,$zero end_for_lettura #se t2==0 esci dal ciclo

#aggiorna l'indice del vettore

mul $t4,$t0,$s2 #t4=i*c

move $t1,$zero #j=o
addi $t0,$t0,1 #i++

loop2:

slt $t3,$t1,$s2 #se j<colonna t3=1
beq $t3,$zero loop_for_lettura #se t2==0 esci dal ciclo


add $t4,$t4,$t1 # (i*c)+j
sll $t4,$t4,2

add $t5,$s0,$t4 #t5=indirizzo[i][j]

li $v0, 5 #lettura intero da tastiera
syscall

sw $v0,0($t5) #Memoria[t1+0]=v0 va mettere il valore letto
#nella posizione t1 della memoria


addi $t1,$t1,1 #j++

j loop2

j loop_for_lettura

end_for_lettura:

#fine del for per acquisire i dati

li $v0, 4 #stampa l'ultima stringa
la $a0, strout
syscall

move $t0,$zero #i=o

#inizio del for per stampare i dati

loop_for_stampa:

slt $t2,$t0,$s1 #se i<riga t2=1
beq $t2,$zero end_for_stampa #se t2==0 esci dal ciclo

#aggiorna l'indice del vettore

mul $t4,$t0,$s2 #t4=i*c

move $t1,$zero #j=o
addi $t0,$t0,1 #i++

la $a0,acapo #
li $v0,4 #va a capo
syscall #


loop2stampa:

slt $t3,$t1,$s2 #se j<colonna t3=1
beq $t3,$zero loop_for_lettura #se t2==0 esci dal ciclo

add $t4,$t4,$t1 # (i*c)+j
sll $t4,$t4,2

add $t5,$s0,$t4 #t5=indirizzo[i][j]

la $a0,spazio #
li $v0,4 #stampa uno spazio vuoto
syscall #

lw $t6,0($t5) #Carico in t5 l'elemento contenuto in Memoria[t5+0]

move $a0,$t6 #
li $v0,1 #stampa t6 (l'elemento contenuto in Memoria[t5+0])
syscall #

addi $t1,$t1,1 #j++

j loop2stampa



j loop_for_stampa


end_for_stampa:

#fine del for per acquisire i dati


li $v0,10 #esci
syscall


Potreste darmi una mano a capire dove l'errore?
Grazie
p.s. ho provato il programma con QtSpim

Ainin92
07-07-2012, 21:22
nemmeno un piccolo aiutino? :( :( :( :( :(

Loading