Sunteți pe pagina 1din 9

; FISIER: DISPLAY.

INC ; creat de Lucian Sabo dupa fisierul cu acelasi nume (c) 1993 Borland ; Sunt definite aici cateva constante necesare apelarii rutinelor de afisare pe ecran CR = oarea LF = 10 si 0DH ;caracterul CR (Carriage Return) are val 13 si indica trecerea carriage-ului pe linia urmatoare 0AH ;caracterul LF (Line Feed) are valoarea indica inceperea unei noi linii ;functia 09h se foloseste pentru a afisa un sir ;functia 02h se foloseste pentru afisarea unui c ;functia 01h se foloseste pentru citirea unui ca

DOSPRINTSTRING = 09H pe ecran DOSPRINTCHAR = 02H aracter pe ecran DOSREADCHAR = 01H racter de la tastatura

DOSINT = 21H ;intreruperea 21h se foloseste pentru executia d e catre mediul DOS a functiilor definite mai sus Ecran.inc ;Rutine utile pentru afisarea pe ecran ;creat de Lucian Sabo dupa exemple de la Borland si alte resurse de pe Net include display.inc ;definirea constantelor folosite aici ;**************************************************************** afiseaza macro mesaj ;macro-ul poate fi folosit la afisarea unor mesa je push ax ;se salveaza in stiva valoarea din ax push dx ;se salveaza in stiva valoarea din dx mov ah,DOSPRINTSTRING ;se pregateste functia DOS de afisare sir de car actere mov dx,offset mesaj ;se pune in dx adresa de unde incepe sirul de ca ractere int 21h ;se executa functia DOS de afisare prin generare a unei intreruperi DOS pop dx ;se restaureaza valoarea initiala din dx pop ax ;se restaureaza valoarea initiala din ax endm ;********************************************************************* ;Afiseaza in zecimal valoarea aflata in dl ;********************************************************************* AfiseazaCifra proc near push ax ;se salveaza in stiva valoarea din ax push dx ;se salveaza in stiva valoarea din dx add dl,'0' ;se converteste in cod ascii valoarea din dl mov ah,DOSPRINTCHAR ;se pregateste in ah functia de afisare caracter int DOSINT ;se executa functia DOS de afisare prin generare a unei intreruperi DOS pop dx ;se restaureaza valoarea initiala din dx pop ax ;se restaureaza valoarea initiala din ax ret ;iesire din procedura AfiseazaCifra endp ;***************************************************** ;Afiseaza pe ecran caracterul ce are codul in dl ;***************************************************** PUTCHAR macro

push dx push ax mov ah,DOSPRINTCHAR int DOSINT pop ax pop dx endm

;salveaza in stiva valoarea din dx ;salveaza in stiva valoarea din ax ;codul functiei de afisare se pune in ah ;se executa functia de afisare ;se restaureaza contonutul registrului ax ;se restaureaza contonutul registrului dx

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; AfiseazaCuvantInBaza10: converteste valoarea din ax in zecimal ;si o afiseaza pe ecran ;Procedura are nevoie ca doua simboluri nACCZ si contorACCZ de tip word ;sa fie definite anterior ;aceasta se poate face in sectiunea de definire a datelor ; .data ; nACCZ dw ? ; contorACCZ dw ? ;S-a ales aceasta cale pentru a mentine valorile din registrele bx si cx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AfiseazaCuvantInBaza10 proc mov contorACCZ,0 mov nACCZ,10 @impartire: xor dx,dx div nACCZ push dx inc contorACCZ are numarul) cmp ax,0 jne @impartire @scrie: pop dx add dl,48 PUTCHAR cmp contorACCZ,0 dec contorACCZ jne @scrie ret AfiseazaCuvantInBaza10 endp ;ia ultima cifra din stiva ;converteste in caracter ;afiseaza caracterul ;la fel pana cand contorul este 0 ;initializeaza contorul ;foloseste n=10 ca impartit ;sau exclusiv pe dx (pune pe 0) ;AX = AX/nACCZ, restul in DX ;tine minte restul in stiva ;numara cate resturi au fost data (cate cifre ;daca ax este 0, nu mai am cifre ;daca nu, se intoarce la impartire

;********************************************************************* Show_Bracket proc push dx mov dl,'[' PUTCHAR pop dx ret Show_Bracket endp ;afisarea unei paranteze patrate pe ecran ;salveaza valoarea din dx in stiva ;in dl se aseaza caracterul ce trebuie afisat ;se executa macro-ul de afisare caracter ;se restaureaza valoarea initiala din dx

;********************************************************************* Show_Endbracket proc push dx mov dl,']' PUTCHAR ;afisarea unei paranteze patrate terminatoare pe ecran ;salveaza valoarea din dx in stiva ;in dl se aseaza caracterul ce trebuie afisat ;se executa macro-ul de afisare caracter

pop dx ret Show_Endbracket endp

;se restaureaza valoarea initiala din dx

;********************************************************************* Afiseaza_virgula proc push dx mov dl,',' PUTCHAR pop dx ret Afiseaza_virgula endp ;Afisarea unei virgule pe ecran ;salveaza valoarea din dx in stiva ;in dl se aseaza caracterul ce trebuie afisat ;se executa macro-ul de afisare caracter ;se restaureaza valoarea initiala din dx

;********************************************************************* Afiseaza_egal proc push dx mov dl,'=' PUTCHAR pop dx ret Afiseaza_egal endp ;Afiseaza semnul egal pe ecran ;salveaza valoarea din dx in stiva ;in dl se aseaza caracterul ce trebuie afisat ;se executa macro-ul de afisare caracter ;se restaureaza valoarea initiala din dx

;********************************************************************* CRLF proc push dx push ax mov dl,CR mov ah,02h re caracter int DOSINT erarea unei intreruperi mov dl,LF int DOSINT erarea unei intreruperi pop ax pop dx ret CRLF endp ;Trece cursorul pe linia urmatoare ;salveaza valoarea din dx in stiva ;salveaza valoarea din ax in stiva ;in dl se aseaza caracterul ce trebuie afisat ;se pregateste in ah codul functiei DOS de afisa ;se executa functia de afisare caracter prin gen DOS 21h ;in dl se aseaza caracterul ce trebuie afisat ;se executa functia de afisare caracter prin gen DOS 21h ;se restaureaza valoarea initiala din ax ;se restaureaza valoarea initiala din dx

Luci.asm (Programul principal) --------------------------------; ; ; ; ; ; ; ; PROIECT "Programare in limbaj de asamblare" (c) 2003 Lucian Sabo Programul face suma a doua matrici A si B, cu n linii si m coloane afisand matricea-rezultat pe ecran. Matricea-rezultat este stocata in matricea A

NOTE: - matricea poate avea maxim 9 linii si 9 coloane - nu exista nici un mecanism de testare a validitatii datelor (deci atentie la introducerea datelor!) ; - in matrice se pot introduce numai valori de la 0 la 9 reprezentate pe un byt e ; - matricea rezultata prin insumarea celor doua matrici va avea evident valori de la 0 la 18 (1 byte)

;--------------------------------------------------------------------dosseg .model small .stack 100h .data msg1 db 'Proiect "PLA" (c) 2003 Lucian Sabo.',CR,LF,'$'; se trece si la lini a urmatoare msg2 db CR,LF,'Introduceti numarul de linii:','$' msg3 db CR,LF,'Introduceti numarul de coloane:','$' msg4 db CR,LF,'Introduceti elementele matricii A.','$' msg5 db CR,LF,'Introduceti elementele matricii B.','$' msg6 db CR,LF,'Suma matricilor A si B este:',CR,LF,'$' n db ? ;stocheaza numarul de linii m db ? ;stocheaza numarul de coloane contor_linii db ? ;contorul de linii necesar procedurilor de citir e/afisare matrice contor_coloane db ? ;contorul de coloane necesar procedurilor de cit ire/afisare matrice contorACCZ dw ? ;necesar pentru procedura AfiseazaCuvantInBaza10 nACCZ dw ? ;necesar pentru procedura AfiseazaCuvantInBaza10 matricea1 db 9 dup(?) ;se rezerva spatiu pentru matricea1 de 9 octeti matricea2 db 9 dup(?) ;se rezerva spatiu pentru matricea2 de 9 octeti .code include ecran.inc ;rutine utile pentru afisarea pe ecran citire_dimensiuni proc afiseaza msg2 mov ah,DOSREADCHAR int DOSINT sub al,30h mov n,al afiseaza msg3 e mov int sub mov ah,DOSREADCHAR DOSINT al,30h m,al ;functia DOS de citire 02h este pregatita ;se executa functia de citire ;se converteste codul ascii in numar ;numarul de coloane introdus este retinut in m ;se pot citi numai valori de la 0 la 9 ;functia DOS de citire 02h este pregatita ;se executa functia de citire ;se converteste codul ascii in numar ;numarul de linii introdus este retinut in n ;se afiseaza mesajul care cere numarul de coloan

ret citire_dimensiuni endp citire_matricea1 proc ;procedura citeste elementele di n matricea1 afiseaza msg4 ;se afiseaza mesajul ce informea za utilizatorul ca trebuie sa introduca elementele mov cl,0 ;se initializeaza contor ul de coloane mov ch,0 ;se initializeaza contor ul de linii mov bx,offset matricea1 ;in bx se retine adresa primului element al matricii A citire_linie_m1: inc ch mov cl,0 e coloane citire_coloana_m1: ;incrementare contor de linii ;se reseteaza contorul d

call CRLF inc cl loane

;se trece la linia urmatoare ;se incrementeaza contorul de co

mov dl,'A' ;pregatire afisare caracter A (e ste vorba de citirea matricii A) PUTCHAR ;se afiseaza A call Show_bracket ;se afiseaza paranteza dreapta mov contor_linii,ch ;in contor_linii se retine conto rul de linii add contor_linii,30h ;se pregateste pentru afisare contorul d e linii, transformandu-se in cod ascii mov dl,contor_linii ;se pregateste in dl contorul de linii mov ah,DOSPRINTCHAR ;se pregateste functia DOS de af isare caracter int DOSINT ;se executa functia DOS de afisa re caracter call Afiseaza_virgula ;se afiseaza virgula mov torul de coloane ca mov add mov int are call Afiseaza_egal ;se afiseaza semnul egal pentru ca utilizatorul sa stie ca se asteapta introducerea unei valori mov ah,DOSREADCHAR ;se pregateste in ah functia de citire caracter de la tastura int DOSINT ;se executa functia de citire sub al,30h ;se transforma codul ascii citit in numar mov [bx],al ;la adresa specificata in bx se pune valoarea citita anterior (adresa din bx va specifica un element al matricii ) inc bx ;incrementam adresa din bx pentr u a trece la urmatorul element al matricii mov ah,DOSPRINTCHAR ;se pregateste afisarea unui car acter mov dl,' ' ;se pregateste in dl codul carac terului spatiu int DOSINT ;se afiseaza caracterul spatiu a ici cmp ch,n numarul de linii dorite ale matricii je iesire_m1 se cauta iesirea ;se compara contorul de linii cu ;daca s-a ajuns la ultima linie ah,DOSPRINTCHAR si la contorul de linii contor_coloane,cl contor_coloane,30h dl,contor_coloane DOSINT ;se procedeaza la fel pentru con

call Show_Endbracket

;se afiseaza paranteza dreapta terminato

cmp cl,m ;se compara contorul de coloane cu numarul de coloane dorite al matricii jne citire_coloana_m1 ;daca nu s-a ajuns la ultima coloana cu citirea se continua citirea coloanelor je citire_linie_m1 ;daca s-a ajuns cu citirea la ul tima coloana se trece la citirea unei noi linii iesire_m1:

cmp cl,m ;se compara contorul de coloane cu numarul de coloane dorite ale matricii jne citire_coloana_m1 ;daca nu s-a ajuns la ultima col oana de pe linia ch (ultima linie), se continua citirea elementelor de pe ultima linie ret citire_matricea1 endp citire_matricea2 proc ;procedura citeste elementele di n matricea2 - B afiseaza msg5 ;se afiseaza mesajul ce informea za utilizatorul ca trebuie sa introduca elementele mov cl,0 ;se initializeaza contor ul de coloane mov ch,0 ;se initializeaza contor ul de linii mov bx,offset matricea2 ;in bx se retine adresa primului element al matricii B citire_linie_m2: inc ch mov cl,0 e coloane citire_coloana_m2: call CRLF inc cl loane mov dl,'B' ;pregatire afisare caracter A (e ste vorba de citirea matricii B) PUTCHAR ;se afiseaza B call Show_bracket ;se afiseaza paranteza dreapta mov contor_linii,ch ;in contor_linii se retine conto rul de linii add contor_linii,30h ;se pregateste pentru afisare contorul d e linii, transformandu-se in cod ascii mov dl,contor_linii ;se pregateste in dl contorul de linii mov ah,DOSPRINTCHAR ;se pregateste functia DOS de af isare caracter int DOSINT ;se executa functia DOS de afisa re caracter call Afiseaza_virgula ;se afiseaza virgula mov torul de coloane ca mov add mov int are call Afiseaza_egal ;se afiseaza semnul egal pentru ca utilizatorul sa stie ca se asteapta introducerea unei valori mov ah,DOSREADCHAR ;se pregateste in ah functia de citire caracter de la tastura int DOSINT ;se executa functia de citire sub al,30h ;se transforma codul ascii citit ah,DOSPRINTCHAR si la contorul de linii contor_coloane,cl contor_coloane,30h dl,contor_coloane DOSINT ;se procedeaza la fel pentru con ;incrementare contor de linii ;se reseteaza contorul d

;se trece la linia urmatoare ;se incrementeaza contorul de co

call Show_Endbracket

;se afiseaza paranteza dreapta terminato

in numar mov [bx],al ;la adresa specificata in bx se pune valoarea citita anterior (adresa din bx va specifica un element al matricii ) inc bx ;incrementam adresa din bx pentr u a trece la urmatorul element al matricii mov ah,DOSPRINTCHAR ;se pregateste afisarea unui car acter mov dl,' ' ;se pregateste in dl codul carac terului spatiu int DOSINT ;se afiseaza caracterul spatiu a ici cmp ch,n numarul de linii dorite ale matricii je iesire_m2 se cauta iesirea ;se compara contorul de linii cu ;daca s-a ajuns la ultima linie

cmp cl,m ;se compara contorul de coloane cu numarul de coloane dorite al matricii jne citire_coloana_m2 ;daca nu s-a ajuns la ultima coloana cu citirea se continua citirea coloanelor je citire_linie_m2 ;daca s-a ajuns cu citirea la ul tima coloana se trece la citirea unei noi linii iesire_m2: cmp cl,m ;se compara contorul de coloane cu numarul de coloane dorite ale matricii jne citire_coloana_m2 ;daca nu s-a ajuns la ultima col oana de pe linia ch (ultima linie), se continua citirea elementelor de pe ultima linie ret citire_matricea2 endp suma proc afiseaza msg6 ;afiseaza mesaj ce informeaza ut ilizatorul ca urmeaza afisarea matricii rezultat push bx ;se salveaza in stiva registrii bx,di,ax si cx ce vor fi modificati push di push ax push cx mov bx,offset matricea1 ;in bx se stocheaza adresa primu lui element al matricii A mov di,offset matricea2 ;in di se stocheaza adresa primului elem ent al matricii B mov al,n ;se pune in al numarul de linii mul m ;AL*m=>AX - numarul de elemente ale matricilor adunare: mov cl,[bx] ;in cl se aseaza elementul speci ficat la adresa din bx mov ch,[di] ;in ch se aseaza elementul speci ficat la adresa din di add cl,ch ;se insumeaza cl cu ch - element ele X,Y ale matricilor A si B mov [bx],cl ;se aseaza rezultatul in matrice a A dec ax ;se decrementeza ax care

este contorul de elemente ale matricii ax=linii*coloane inc di ;se incrementeza adresa din di pentru a se trece la urmatorul element din matricea B inc bx ;se incrementeza adresa din bx pentru a se trece la urmatorul element din matricea A cmp ax,0 ;se compara contorul de elemente din ax cu 0 jne adunare ;cat timp mai sunt elemente de p arcurs se continua adunarea matricilor pop cx ;se restaureaza din stiva regist rii bx,di,ax si cx ce au fost modificati pop ax pop di pop bx ret suma endp afisare macro matrice mov cl,0 ;se initializeaza contor ul de coloane din cl mov ch,0 ;se initializeaza contor ul de linii din ch mov bx,offset matrice ;bx stocheaza adresa primului el ement al matricii transmise ca parametru macro-ului afisare_linie: call CRLF ;se trece la linia urmat oare inc ch ;se incrementeaza contorul de li nii mov cl,0 ;se reseteaza contorul d e coloane afisare_coloana: inc cl ;se incrementeaza contorul de co loane mov ax,[bx] ;in ax se retine valoarea elemen tului curent din matrice de la adresa bx ;punem in ah 0 pentru ca in ax sa fie valoarea reala pe 16 biti de la adresa din bx mov ah,0 ;pentru ca valorile din matrice sunt pe 16 biti ;se apeleaza procedura de afisare valoare de tip word in baza 10 ce preia valoarea anterior asezata in ax call AfiseazaCuvantInBaza10 inc bx ;se incrementeza adresa din bx c e asigura trecerea la urmatorul element din matrice mov ah,DOSPRINTCHAR ;se pregateste in ah functia de afisare caracter mov dl,' ' ;se pregateste in dl caracterul de afisat (spatiu) int DOSINT ;se afiseaza spatiu cmp ch,n n ch cu numarul de linii dorite ale matricii je ies se cauta iesirea ;se compara contorul de linii di ;daca s-a ajuns la ultima linie

cmp cl,m ;se compara contorul de coloane din cl cu numarul de coloane dorite ale matricii jne afisare_coloana ;daca nu s-a ajuns la ultima col

oana a matricii de pe randul ch se continua citirea coloanelor je afisare_linie ;daca s-a ajuns la ultima coloan a de pe linia ch se trece la afisarea liniei urmatoare ies: cmp cl,m ;se compara contorul de coloane din cl cu numarul de coloane dorite ale matricii jne afisare_coloana ;daca nu s-a ajuns la ultima col oana de pe linia ch (ultima linie), se continua afisarea elementelor de pe ultim a linie endm start: mov ax,@data ;rutina specifica asm mov ds,ax afiseaza msg1 ;se afiseaza mesaj introductiv call citire_dimensiuni ;se apeleaza procedura de citire a dimen siunilor matricilor call citire_matricea1 ;se apeleaza procedura de citire a elementelor matricii A call citire_matricea2 ;se apeleaza procedura de citire a elementelor matricii B call suma ;se apeleaza procedura d e efectuare a sumei dintre matricile A si B afisare matricea1 ;se afiseaza rezultatul sumei si tuat in matricea A mov ax,4c00h al int DOSINT end start ;se intoarce promptul DOS la fin

S-ar putea să vă placă și