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!