Extras din curs
maatrici
.model small
.data
maxlin2 db ?
maxdg db ?
sumadg db ?
mat db 4,5,7,9
db 2,6,3,0
db 0,6,3,2
db 0,8,9,1
.code
mov ax,@data ;initializare segment
mov ds,ax ;de date
lea di,maxlin2 ;pune in di deplasamentul lui maxlin2, ca sa stim unde
sa urmarim variabilele in td (ds:[di])
mov cx,4 ;initializare registru cx pt. bucla
mov maxdg,0 ;initializam maxdg cu 0 (maximul este 0 momentan)
maxd: mov si,byte ptr cx ;punem in si valoarea din cx si decrementam
dec si ;in acest fel, nu ne mai preocupa parcurgerea liniei
mov bx,si ;bx ia valoarea si (suntem pe diagonala principala)
mov ax,4 ;in registrul ax punem 4, in vederea inmultirii cu bx (cu bx
selectam linia si cu si coloana)
mul bx ;aici inmultim, rezultatul este depus de CPU in ax
mov bx,ax ;copiem ax in bx
mov dl,[bx].mat[si] ;punem elementul curent de la adresa ds:[bx+offset
mat+si] in dl
cmp dl,maxdg ;comparam elementul curent cu maximul de pe diagonala
jbe cont1 ;daca el. curent <=max nu facem nimic, reitereaza bucla
mov maxdg,dl ;altfel, punem in maxdg valoarea elementului curent
cont1: loop maxd
mov cx,4 ;initializare registru cx pt. bucla
mov sumadg,0 ;initializam suma cu 0
sumd: mov si,byte ptr cx ;punem in si valoarea din cx si decrementam
dec si ;in acest fel, nu ne mai preocupa parcurgerea liniei
mov bx,3 ;in bx punem valoarea 3
sub bx,si ;dupa care il vom scade pe si din bx (formula elem. de pe
diag secundara)
mov ax,4 ;in registrul ax punem 4, in vederea inmultirii cu bx (cu bx
selectam linia si cu si coloana)
mul bx ;aici inmultim, rezultatul este depus de CPU in ax
mov bx,ax ;copiem ax in bx
mov dl,sumadg ;copiem valoarea variabilei sumadg, din memorie in
registrul dl
add dl,[bx].mat[si] ;adunam dl cu elementul curent de la adresa
ds:[bx+offset mat+si]; CPU pune rezultatul in primul operand
mov sumadg,dl ;punem noua suma inapoi in memorie (la adresa
ds:[offset sumdg])
cont2: loop sumd
mov cx,4 ;initializare registru cx pt. bucla (4=lungime linie)
schimb: mov si,byte ptr cx ;punem in si valoarea din cx si decrementam
dec si ;in acest fel, nu ne mai preocupa parcurgerea liniei
mov bx,0 ;initializam bx cu 0 (referim prima linie)
mov dl,[bx].mat[si] ;punem in dl elementul de la adresa ds:[offset
mat+bx+si]
mov bx,12 ;initializam bx cu 12 (referim ultima linie, primele
3x4=12)
mov dh,[bx].mat[si] ;punem in dh elementul de la adresa ds:[offset
mat+bx+si]
xchg dl, dh ;interschimbam dl cu dh
mov [bx].mat[si],dh ;punem pe ultima linie noile valori
mov bx,0 ;selectam prima linie
mov [bx].mat[si],dl ;punem pe prima linie noile valori
loop schimb
mov cx,4 ;initializare registru cx pt. bucla
mov bx,4 ;initializam bx cu 4 (referim linia a doua)
mov maxlin2,0 ;initializam max cu 0 (maximul este 0 momentan)
maxl2: mov si,byte ptr cx ;punem in si valoarea din cx si decrementam
dec si ;in acest fel, nu ne mai preocupa parcurgerea liniei
mov dl,[bx].mat[si] ;punem elementul curent de pe linia 2 in dl
cmp dl,maxlin2 ;comparam elementul curent cu maximul
jbe cont3 ;daca el. curent <=max nu facem nimic, reitereaza bucla
mov maxlin2,dl ;altfel, punem in max valoarea elementului curent
cont3: loop maxl2
mov ax,4c00h
int 21h
end
Preview document
Conținut arhivă zip
- Limbaje de Asamblare.doc