Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [ASSEMBLY] Stampare una matrice

    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??

    codice:
    .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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    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

    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.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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' ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Ah, ok.

    Grazie!

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Alla fine poi le righe corrette sono:
    codice:
    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?

    codice:
    .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
    .
    .
    .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.