PDA

Visualizza la versione completa : [ASSEMBLY] Stampare una matrice


Downloader
16-04-2008, 19:00
Per provare ad impratichirmi un po' con le matrici sto provando a fare un programmino il quale data una matrice di 3 righe e 5 colonne mi stampa tutto il suo contenuto riga per riga.

Purtroppo però il codice pare avere qualche problemino, anche se io non lo riesco a vedere.
Ci sono un paio di punti che non mi sono chiari (li ho segnalati, tra l'altro), ma non so se dipende da quelli.

Come emulatore uso Spim.

Potete darmi una mano??



.data
MATRICE: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
N_RIGA: .word 3
N_COL: .word 5
NEW_LINE: .ascii "\n"
VIRGOLA: .ascii ","

.text
.globl main
main:
lw $s0,N_RIGA # numero totale righe
lw $s1,N_COL # numero totale colonne
la $s2,MATRICE
li $t0,0 # indice riga
li $t1,0 # indice colonna

ciclo:
beq $t0,$s0,esci

# il registro t3 verrà usato per calcolare il valore k-esimo della matrice
mul $t3,$s1,$t0
add $t3,$t3,$t1
mul $t3,$t3,4

li $v0,4
la $a0,MATRICE($t3) #questa non la capisco tanto bene
syscall

add $t1,$t1,1 # incremento indice colonna

beq $t1,$s1,ciclo2 # se ho finito di scansionare tutte le colonne della i-esima riga ($t0) vado a ciclo 2

li $v0,4
la $a0,VIRGOLA
syscall

j ciclo

ciclo2:
add $t0,$t0,1 # incremento indice riga
li $t1,0 # setto a 0 indice colonna

li $v0,4
la $a0,NEW_LINE # perchè?
syscall

j ciclo

esci:
li $v0,10
syscall



Grazie

oregon
16-04-2008, 19:17
Ma scusa ... quale sarebbe il problemino di cui parli ?

Cosa viene visualizzato ?

Non ho installato spim e non intendo installarlo ma se vuoi un aiuto, devi dare precise informazioni ...

Downloader
16-04-2008, 19:23
Originariamente inviato da oregon
Ma scusa ... quale sarebbe il problemino di cui parli ?

Cosa viene visualizzato ?

Non ho installato spim e non intendo installarlo ma se vuoi un aiuto, devi dare precise informazioni ...

Si si certo, scusa.
Ho postato troppo in fretta :dhò:

Il problema è il seguente:
gli elementi della matrice non vengono stampati a schermo.
Gli unici caratteri stampati sono le "," (ma anche questi hanno problemi visto che ne vengono stamp ate 4 "," su una riga e 2 su un'altra, e non solo...) e il carattere di accapo.

Fondamentalmente però io penso che il modo di pensare l'algoritmo non sia sbagliato.

oregon
16-04-2008, 19:35
Guarda ... ho dato un'occhiata e mi sembra che queste righe

la $a0,MATRICE($t3)
syscall

servano a leggere il prossimo elemento della matrice da visualizzare e lo mandino a video.

Ma la visualizzazione del dato avviene considerando lo stesso in codice ASCII e i valori da 1 a 15 sono codici ASCII non visualizzabili ...

Quindi, prima di visualizzarlo dovrai convertirli in ASCII.

Mentre per i valori minori di 10 e' semplice (basta che tu aggiunga il valore 48 al valore letto dalla matrice prima di visualizzarlo), per gli altri c'e' qualche problemino in piu' ...

Downloader
16-04-2008, 19:39
Ah, ok.

Grazie!

Downloader
17-04-2008, 16:39
Alla fine poi le righe corrette sono:


li $v0,1
lw $a0,MATRICE($t3)


Una domanda:

se stessi scorrendo un array di dimensione sconosciuta e mi dovessi fermare al terminatore di stringa come dovrei fare??
Il terminatore è indicato dal carattere di codice ascii 0 giusto?



.data
STRINGA: .asciiz "c i a o"
STRINGAB: .space 50
NEW_LINE: .ascii "\n"

.text
.globl main
main:
la $t0,STRINGA
li $t1,0 # contatore
li $t2,0 # spiazzamento

while:
lb $t3,($t0)
beq $t3,0,stamparis
.
.
.

Loading