Stampa a video di una matrice.

di il
12 risposte

Stampa a video di una matrice.

Risalve a tutti,sono alle prese con un nuovo esercizio in assembly che prevede la stampa di una matrice. Ho provato a cercare un po' di materiale in giro ,sia sul sito che su google,sulle matrici ma ben poco ho trovato(se avete qualche fonte non siate timidi a postarla^^). Vi posto ciò che ho scritto. Si tratta di un codice che dovrebbe stampare a video una matrice,commento per rendere il più chiaro possibile il tutto!
data segment  'DATA' 
; La matrice è memorizzata per riga
mat  db 1,2,3,4                
        db 5,6,7,8
        db 9,0,4,5
colonne equ 4  
data ends 

stack segment 'STACK'
    dw   128  dup(0)
stack ends

code segment 'CODE'
start:

    mov ax,@data
    mov ds, ax 
    
    mov al,0
;Calcolo posizione della riga nell'array fisico. Uso per gestire la matrice il comando
;indice di riga*colonna + indice di colonna ossia mat+i*c+j
       
cicloest:mov bl,colonne
            mul bl                     ;moltiplico per colonne e il risultato lo trovo in ax
            mov bx,ax              ;sposto il risultato in ax
            xor si,si                  ; Inizializzo indice di colonna assegnato a SI
            mov cx,colonne       ;muovo il numero di colonne in cx registro che serve
            ciclo:
                   mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                   add dl,30h
                   mov ah,02h
                   int 21h                    ;uso la 02h per stampare a video l'elemento del vettore
                   mov dl," "  
                   mov ah,02h
                   int 21h                    ;stampo a video lo spazio tra un elemento e l'altro
                   inc si
                   loop ciclo                 ;ciclo che continua fino a quando non termino le colonne
                   add al,1                   ;passo alla riga successiva
                   cmp al,3                  ;se sono arrivato alla terza riga ho finito
                   JL cicloest                ;fino a quando è minore di 3 ripeto il ciclo
                   JMP fine
                
       fine:    NOP
                  mov ax, 4ch ; ritorna il controllo al Sistema Operativo
                   int 21h    
             
end start ; Termina la fase di assemblaggio e imposta l'istruzione 

12 Risposte

  • Re: Stampa a video di una matrice.

    Dovrebbe ... e che succede?
  • Re: Stampa a video di una matrice.

    Purtroppo stampa a video solo la prima riga e non so perchè ..
  • Re: Stampa a video di una matrice.

    Vedo che usi al come contatore ... ma, se non sbaglio, al viene modificato nel ciclo dalla moltiplicazione.
  • Re: Stampa a video di una matrice.

    Vorrei usare la gestione delle matrici con il comando [mat+i*c+j],quindi al a ogni giro deve essere modificicato in quanto al contiene i*c,dove i è l'indice di riga e varia mentre c è il numero di colonne della mia matrice che non cambia,quindi poichè il contenuto della moltiplicazione (i*c) varia,varia anche al come è normale che sia... Non riesco proprio a capire dove possa essere l'errore
  • Re: Stampa a video di una matrice.

    Scusa ... ma te l'ho detto dove può essere l'errore ... mi hai risposto con un altro discorso ...

    Del registro

    AL

    usato come contatore e di quello che ti ho detto, che mi rispondi?
  • Re: Stampa a video di una matrice.

    Ah scusa pensavo volessi sapere perchè usavo al xD Comunque ho modificato il codice in questo modo ma questa volta oltre la prima stampa anche la seconda riga ma non la terza
    data segment  'DATA' 
    ; La matrice è memorizzata per riga
    mat  db 1,2,3,4                
            db 5,6,7,8
            db 9,0,4,5
    colonne equ 4  
    data ends 
    
    stack segment 'STACK'
        dw   128  dup(0)
    stack ends
    
    code segment 'CODE'
    start:
    
        mov ax,@data
        mov ds, ax 
        
        mov bl,0
    ;Calcolo posizione della riga nell'array fisico. Uso per gestire la matrice il comando
    ;indice di riga*colonna + indice di colonna ossia mat+i*c+j
           
    cicloest:   mov al,colonne
                mul bl                     ;moltiplico per colonne e il risultato lo trovo in ax
                mov bx,ax                  ;sposto il risultato in ax
                xor si,si                  ; Inizializzo indice di colonna assegnato a SI
                mov cx,colonne             ;muovo il numero di colonne in cx registro che serve
                ciclo:
                       mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                       add dl,30h
                       mov ah,02h
                       int 21h                    ;uso la 02h per stampare a video l'elemento del vettore
                       mov dl," "  
                       mov ah,02h
                       int 21h                    ;stampo a video lo spazio tra un elemento e l'altro
                       inc si
                       loop ciclo                 ;ciclo che continua fino a quando non termino le colonne
                       add bl,1                   ;passo alla riga successiva
                       cmp bl,3                  ;se sono arrivato alla terza riga ho finito
                       JLE cicloest                ;fino a quando è minore di 3 ripeto il ciclo
                       JMP fine
                    
           fine:    NOP
                      mov ax, 4ch ; ritorna il controllo al Sistema Operativo
                       int 21h    
                 
    end start ; Termina la fase di assemblaggio e imposta l'istruzione 
    
  • Re: Stampa a video di una matrice.

    Adesso usi BL come contatore ... ma anche BL viene usato come parte di BX per la base e quindi perde il suo valore lungo il ciclo ...

    Il problema è che il registro che usi come contatore NON deve essere modificato durante il ciclo da altre istruzioni ...
  • Re: Stampa a video di una matrice.

    Purtroppo uso tutti i registri ..quale potrei usare? potresti correggere tu il codice,per piacere
  • Re: Stampa a video di una matrice.

    Non usi tutti i registri e comunque puoi sempre usare una variabile in memoria
  • Re: Stampa a video di una matrice.

    Tutto risolto oregon! Posto il codice corretto?
  • Re: Stampa a video di una matrice.

    Sarebbe meglio per chi legge ...
  • Re: Stampa a video di una matrice.

    Ok,allora lo posto.
    
    data segment  'DATA' 
    ; La matrice è memorizzata per riga
    mat  db 1,2,3,4                
            db 5,6,7,8
            db 9,0,4,5
    colonne equ 4
    cont db ?  
    data ends 
    
    stack segment 'STACK'
        dw   128  dup(0)
    stack ends
    
    code segment 'CODE'
    start:
    
        mov ax,@data
        mov ds, ax 
        
        mov cont,0
    ;Calcolo posizione della riga nell'array fisico. Uso per gestire la matrice il comando
    ;indice di riga*colonna + indice di colonna ossia mat+i*c+j
           
    cicloest:mov al,colonne
                mul cont                    ;moltiplico per colonne e il risultato lo trovo in ax
                mov bx,ax             ;sposto il risultato in ax
                xor si,si                 ; Inizializzo indice di colonna assegnato a SI
                mov cx,colonne             ;muovo il numero di colonne in cx registro che serve
                ciclo:
                       mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                       add dl,30h
                       mov ah,02h
                       int 21h                    ;uso la 02h per stampare a video l'elemento del vettore
                       mov dl," "  
                       mov ah,02h
                       int 21h                    ;stampo a video lo spazio tra un elemento e l'altro
                       inc si
                       loop ciclo          ;ciclo che continua fino a quando non termino le colonne
                       inc cont            ;passo alla riga successiva
                       cmp cont,3           ;se sono arrivato alla terza riga ho finito
                       JL cicloest        ;fino a quando è minore di 3 ripeto il ciclo
                       JMP fine
                    
           fine:     NOP
                       mov ah, 4ch ; ritorna il controllo al Sistema Operativo
                       int 21h    
                 
    end start ; Termina la fase di assemblaggio e imposta l'istruzione
     
Devi accedere o registrarti per scrivere nel forum
12 risposte