Trasposizione di una matrice quadrata 4x4

di il
9 risposte

Trasposizione di una matrice quadrata 4x4

Salve a tutti Come da titolo sto cercando di trasporre una matrice 4x4,solo che la trasposizione della matrice avviene solo in parte,infatti 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 che non è la trasposta!:
1 5 9 3
2 6 7 8
3 0 1 2
4 4 5 6

La trasposta è la seguente
1 5 9 3
2 6 0 4
3 7 1 5
4 8 2 6
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
            
Grazie a tutti dell'attenzione!

9 Risposte

Devi accedere o registrarti per scrivere nel forum
9 risposte