Matrici ASSEMBLY 8086

di il
13 risposte

Matrici ASSEMBLY 8086

Salve ragazzi..Mi sono completamente bloccata su una traccia che prevede il calcolo della matrice trasposta di una matrice quadrata di dimensioni a piacere che viene ricevuta da tastiera...non ho idea di come fare a scambiare le righe con le colonne..Per leggere la matrice ho usato l'indirizzamento base index non sono sicura sia corretto ciò che ho scritto..e per scambiare ho pensato di invertire il registro BX con SI ma credo sia errato..se qualcuno può autarmi...grazie mille : )

RIGHE EQU 4
COLONNE EQU 4
data segment
MATRICE DB RIGHE*COLONNE DUP (?)  
COUNT DW ?
ends 
stack segment
    dw   128  dup(0)
ends
code segment
start: 
MOV AX,@data
MOV DS,AX 
MOV CX,RIGHE*COLONNE
MOV COUNT,0
CICLO: 
MOV AH,01H
INT 21H
MOV DL,MATRICE[SI][BX] 
CMP COUNT,8 ; fino a metà della lunghezza
JL inverti
MOV SI,COUNT
MOV BX,COUNT*COLONNE 
INC COUNT 
LOOP CICLO 
inverti: 
;??? qui devo scambiare  
mov ax, 4c00h
int 21h  
ends
end start

13 Risposte

  • Re: Matrici ASSEMBLY 8086

    La matrice originale deve essere conservata o sostituita da quella trasposta?

    Hai provato a fare l'esercizio scrivendo su carta i passi da svolgere?
  • Re: Matrici ASSEMBLY 8086

    Ciao ...la traccia non lo specifica quindi direi che la posso sostituire credo sia più semplice....si sto provando a ragionarci..Forse ho trovato il primo errore.. i valori che vengono presi da tastiera vengono salvati in AL giusto?mi sa che non ha molto senso fare MOV DL ,MATRICE[SI][BX] senza fare MOV MATRICE[SI][BX],AL vero?
    quindi MOV MATRICE[SI][BX],AL
    MOV DL,AL
    Per trasporre ci ho ragionato su carta,in generale l' algoritmo lo conosco perchè in c++ l'ho fatta la trasposta ma non so proprio come fare in assembly, perchè non ho righe e colonne ma tengo questi due registri BX SI ..ho provato a scambiare il contenuto di BX con quello di SI
    MOV SI,COUNT*COLONNE
    MOV BX,COUNT
    ma non va,non credo abbia molto senso...il bello è che su intenet se in generale non c'è molto sulle matrici praticamente niente......comunque grazie mille : )
  • Re: Matrici ASSEMBLY 8086

    Scusa ma gli indici delle matrici quali sono ?
    tu hai definito giustamente un vettore chè contiene i dati di tutta la matrice.
    ma in assembler ammeno che tu non utilizzi librerie particolari non puoi usare la seguente forma:
    x=mat[a] dove a e b sono gli indici della matrice.
    adesso per gestire la matrice come tale dovrai avrai bisogno di 2 indici per indicizzare le righe righe e le colonne.
    dovrai fare:
    bx=0 prima riga bx=bx+4= restanti righe (stimo trattando una matrice 4x4 se invece vuoi la matrice di n elementi basta che al posto di 4 metti n)
    si=0 prima colonna si=si+4 (vale lo stesso discorso fatto per le righe)
    esempio l'elemento di matrice (1,4) sarà indicizzato da mat[3] perchè in assembler si inizia da 0 e non da 1
    mentre l'elemento di matrice (2,3) sarà indicizzato da mat[6]
    ricordati che comunque è un vettore
    adesso se vuoi scambiare righe con colonne basterà che fai un ciclo per la lunghezza delle matrice.
    esempio di scambio riga con colonna per una matrice 4x4
    la matrice e definita come : mat db 16 dup (?)
    
    mov bx,0 ; mi azzero l'indice delle righe
    mov si,0 ; mi azzero l'indice delle colonne
    mov cx,4 ; dimensione della riga
    mov dx,0 ; azzero un registro che mi servirà per lo scambio dei dati
    ciclo:
    mov dh,mat[bx] ; prendo l'elemento della riga.
    mov dl,mat[si] ; prendo l'elemento della colonna.
    xchg dh,dl ; effettuo lo scambio.
    mov mat[bx],dh ; posiziono l'elemento della riga.
    mov mat[si],dl ;posiziono l'elemento della colonna.
    inc bx  ; vado all'elemento successivo della riga.
    add si,4 ; vado all'elemento successivo della colonna.
    loop ciclo ; ripeto lo scambio.
    ; ............
    ; .............
    
    ; qui metti la stampa o esci dal programma.
    spero di esserti stato d'aiuto
  • Re: Matrici ASSEMBLY 8086

    Essere d'aiuto è riduttivo,grazie mille ragazzi.. : )
    io stavo utilizzando questo indirizzamento per le matrici ma poi mi perdevo!
    matice[BX] + [SI] oppure
    matrice[BX][SI]
    se si tratta di byte:
    SI->j-> j=colonna
    BX-> i*n i=colonna; n sono il numero di colonne
  • Re: Matrici ASSEMBLY 8086

    Occhio ...

    matice[BX][SI]

    equivale a

    matice[BX + SI]

    quindi, a seconda di come hai impostato il ciclo, potrebbe non essere corretto.

    Del resto per accedere ad un singolo elemento ti basta un solo puntatore

    matice[SI]

    opportunamente calcolato.

    E occhio anche al fatto che, dato che devi riusare lo stesso spazio per la trasposta, i cicli devono essere impostati bene ...

    P.S. Per scambiare i due valori ti basta un registro temporaneo e tre istruzioni

    mov dl,mat[bx]
    xchg mat[si],dl
    mov mat[bx],dl
  • Re: Matrici ASSEMBLY 8086

    Scusami ma mi sto un attimo confondendo :S facciamo un passo indietro ..per caricare la matrice all'inizio devo utilizzare un solo puntatore?...matrice[SI]
    code segment
    start: 
    MOV AX,@data
    MOV DS,AX 
    MOV CX,RIGHE*COLONNE
    MOV COUNT,0
    CICLO: 
    MOV AH,01H
    INT 21H
    MOV DL,MATRICE[BX][SI] 
    MOV SI,COUNT 
    MOV BX,COUNT*COLONNE 
    INC COUNT 
    LOOP CICLO
    perchè effettivamente non posso incrementare la variabile count contemporaneamente sia in BX che in SI perchè io devo prima caricare tutta la prima riga quindi i=0 e j varia e poi posso incrementare la riga ...quindi così è sbagliato..grazie mille...so di essere un disastro
  • Re: Matrici ASSEMBLY 8086

    Sì ... utilizza un solo puntatore [SI]

    Del resto l'array viene riempito completando le varie righe e quindi SI va semplicemente incrementato ... ovviamente dopo averlo azzerato all'inizio.

    La funzione di input

    MOV AH,01H
    INT 21H

    restituisce il valore di un singolo carattere in ASCII nel registro AL e quindi per inserirlo nella matrice dovrai convertirlo in binario

    SUB AL,'0'

    e memorizzarlo

    MOV MATRICE[SI],AL

    (non ho fatto controlli sulla regolarità del carattere).
  • Re: Matrici ASSEMBLY 8086

    Ho caricato la matrice con un solo indice e provato a stamparla...senza scambiare niente per ora..
    code segment
    start:
    xor ax,ax
    mov ax,16
    mov cx,16
    ciclo:
    mov ah,01
    mov dl,09
    int 21h 
    ;sub al,30h
    mov mat[si],al 
    inc si   
    loop ciclo       
    mov ah,02h
    mov dl,09
    int 21h  
    mov cx,16 
    xor si,si  
    ciclo1:
    mov ah,02h
    mov dl,mat[si]
    ;add dl,30h
    inc si
    int 21h  
    loop ciclo1
    mov ax, 4c00h
    ends
    end start
    
    così senza conversioni funziona mi stampa il vettore che ho inserito,ma come mi hai fatto notare In AL ho il codice ASCII del carattere letto.. però se metto SUB AL,30H mi stampa dei simboli,come mai? grazie : )
  • Re: Matrici ASSEMBLY 8086

    Tu non hai per nulla chiari i concetti di ASCII e binario.

    I valori ASCII dei caratteri sono utilizzati in input/output (su video ad esempio). Quindi da tastiera ottieni il valore ASCII e se vuoi visualizzarlo devi usare l'ASCII.

    In memoria, per i calcoli con gli interi (come in una matrice) devi usare i valori binari.

    Quindi

    1) in input ottieni l'ASCII e sottrai '0' per memorizzare il valore binario in memoria
    2) in output prendi il valore binario e aggiungi '0' prima di visualizzare il carattere

    Se non aggiungi il valore '0' prima di visualizzare avrai i caratteri sbagliati a video ...
  • Re: Matrici ASSEMBLY 8086

    Sisi scusa mi sono espressa male..avevo anche messo add dl,30h infatti nel codice li ho lasciati come commenti per farti vedere...all'inizio non so perchè non aveva funzionato poi chiudendo il programma e riprovando ora funziona così come avevo scritto... da ASCII a binario poi torno da binario ad ASCII ..sub al,30h e add dl,30h nella stampa giusto? : ) ora devo provare a scambiare le righe con le colonne ...
  • Re: Matrici ASSEMBLY 8086

    Mi dispiace riprendere una vecchia discussione,ma io sto seguendo il codice che avete postato ma non funziona,o per lo meno funziona,ma solo in parte. Ossia se inserisco la seguente matrice

    1 2 3 4
    5 6 7 8
    9 0 1 2
    3 4 5 6

    Mi stampa la seguente matrice "trasposta":
    1 5 9 3
    2 6 7 8
    3 0 1 2
    4 4 5 6

    Vi posto il codice che ho adoperato:
    data segment  'DATA' 
    ; La matrice è memorizzata per riga
    mat     db ?,?,?,?                
            db ?,?,?,?
            db ?,?,?,?
            db ?,?,?,?
    cont db 0
    colonne equ 4
            dom db 'inserire la matrice :',13,10,'$'
            ris db 'La matrice inserita e:',13,10,'$'
            ris2 db 'Una volta effettuata la trasposizione della matrice :',13,10,'$'
                    
    data ends 
    
    stack segment 'STACK'
        dw   128  dup(0)
    stack ends
    
    code segment 'CODE'
    start:
    
        mov ax,@data
        mov ds, ax 
        
        mov ah,09h
        lea dx,dom
        int 21h
        
        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
           
       cicloest1: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
                 mov dl,13
                 mov ah,02h
                 int 21h
                 mov dl,10
                 mov ah,02h
                 int 21h  
                 ciclo1:mov ah,01h
                       int 21h 
                       mov mat[bx+si],al   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                       ;uso la 02h per stampare a video l'elemento del vettore
                       mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                       mov ah,02h
                       int 21h
                       inc si
                       loop ciclo1         ;ciclo che continua fino a quando non termino le colonne
                       inc cont            ;passo alla riga successiva
                       cmp cont,4          ;se sono arrivato alla terza riga ho finito
                       JL cicloest1
                      
       mov cont,0 
       
       mov ah,09h
       lea dx,ris
       int 21h
       
       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
                mov dl,13
                mov ah,02h
                int 21h
                mov dl,10
                mov ah,02h
                int 21h  
                ciclo:
                       mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                       mov ah,02h
                       int 21h             ;uso la 02h per stampare a video l'elemento del vettore
                       mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                       mov ah,02h
                       int 21h
                       inc si
                       loop ciclo          ;ciclo che continua fino a quando non termino le colonne
                       inc cont            ;passo alla riga successiva
                       cmp cont,4          ;se sono arrivato alla terza riga ho finito
                       JL cicloest         ;fino a quando è minore di 3 ripeto il ciclo
          
           mov cont,0 
          
           mov ah,09h
           lea dx,ris2
           int 21h
           
           mov bx,0 ; mi azzero l'indice delle righe
           mov si,0 ; mi azzero l'indice delle colonne
           mov cx,4 ; dimensione della riga
           mov dx,0 ; azzero un registro che mi servirà per lo scambio dei dati
    scambio:
          mov dh,mat[bx] ; prendo l'elemento della riga.
          mov dl,mat[si] ; prendo l'elemento della colonna.
          xchg dh,dl ; effettuo lo scambio.
          mov mat[bx],dh ; posiziono l'elemento della riga.
          mov mat[si],dl ;posiziono l'elemento della colonna.
          inc bx  ; vado all'elemento successivo della riga.
          add si,4 ; vado all'elemento successivo della colonna.
          loop scambio ; ripeto lo scambio
          
          mov cont,0
          
          cicloest2: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
                mov dl,13
                mov ah,02h
                int 21h
                mov dl,10
                mov ah,02h
                int 21h  
                ciclo2:
                       mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                       mov ah,02h
                       int 21h             ;uso la 02h per stampare a video l'elemento del vettore
                       mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                       mov ah,02h
                       int 21h
                       inc si
                       loop ciclo2          ;ciclo che continua fino a quando non termino le colonne
                       inc cont            ;passo alla riga successiva
                       cmp cont,4          ;se sono arrivato alla terza riga ho finito
                       JL cicloest2         ;fino a quando è minore di 3 ripeto il ciclo 
       
       fine:    NOP
                mov AH,4CH
                INT 21H
                
    
  • Re: Matrici ASSEMBLY 8086

    Riprendere vecchie discussioni porta a problemi. Quello che si discuteva in quella discussione era basato su un'altra organizzazione della matrice e su altri presupposti.

    Se hai un problema, apri un nuovo thread e fai la tua richiesta con il tuo codice.

    Il codice che hai mostrato dovrebbe effettuare la trasposizione della matrice, infatti una frase visualizzata è

    "Una volta effettuata la trasposizione della matrice"

    Quindi non si capisce ... vuoi trasporre o no la matrice??
  • Re: Matrici ASSEMBLY 8086

    Aspetta oregon apro un nuovo thread e parliamo con più ordine lì!
Devi accedere o registrarti per scrivere nel forum
13 risposte