Calculatoare
Masurarea gradului de egalitate a doua fisiere - limbaje de asamblare -ACADEMIA DE STUDII ECONOMICEFACULTATEA DE CIBERNETICa, STATISTICa si INFORMATICA ECONOMICAlimbaje de asamblare -proiect -Masurarea gradului de egalitate a doua fisiere BucurestiIntroducere Obiectivul problemei Compararea a 2 fisiere sub aspectul continutului, atribultelor si lungimii acestora. Necesitatea Acest proiect demonstreaza importanta folosirii bibliotecilor de macrodefinitii si proceduri pentru rezolvarea oricaror probleme. In cazul de fata s-au folosit macrodefinitii si procedure pentru lucrul cu fisiere, lucrul cu siruri de caractere si combinatii ale acestoraMijloacele de realizare Codul sursa este scris in Notepad.exe, dar si in Microsoft Visual Studio .NET (util mai ales pentru determinarea usoara a liniei)Compilator, link-editor si dezasamblor utilizat: cele utilizate si in cadrul seminarului. Sursa: https://www.assembler.ase.ro/Documentatie/TASM.rar Utilizarea comenzilor pentru orice processor de tipul 80 x 86 Enuntul problemei Sa se scrie programul care realizeaza masurarea gradului de egalitate dintre doua fisiere. Modul de rezolvare Se folosesc intreruperile specifice operatiilor de lucru cu fisiere. Acestea utilizeaza intreruperea 21h impreuna cu setarea registrului AH cu valori cuprinse intre 3Ch 43h (60-67 in sistem zecimal).De asemenea sunt in biblioteca introduce si macrodefinitii si proceduri pentru afisarea formatata si pentru comparare a 2 siruri de caractere. Macrodefinitii - necesitate, schema logica, implementare, mod de folosire Macrodefinitiile si procedurile se afla in biblioteca „macrofis.asm”. In continuare sunt headerele macrodefinitiilor insotite de explicatiile aferente: LUCRUL CU FISIERE: Creare MACRO Fhndl, er, Filen – creaza un nou fisier cu numele „Filen” Scriere MACRO FHndl,text,text_size,er – scrie in fisierul cu handlerul „FHndl” textul „text”, de lungime „text_size”. Deschidere MACRO Fhndl, Filen,modD, er – deschide fiserul „Filen” Citire2 MACRO Buffer, lungimeCit, FHndl, er – citeste din fisierul cu handlerul „FHndl” un numar de octeti de „lungimeCit”. Inchidere MACRO FHndl, er – inchide fisierul cu handlerul “FHndl”. fSize MACRO FHndl,deplasare,tip_deplasare, er,lg – realizeaza o deplasare in fisier de in functie de variabila “tip_deplasare” care indica punctual initial din fisier de unde se face offset-ul. Necesara pt determinarea lungimii. Atribute MACRO Filen, actiune, atrb,er – intoarce atributele fisierului cu numele “filen” in variabila “atrb” pentru comparare. LUCRUL CU SIRURI DE CARACTERE: arata MACRO mesaj1 – afisaza mesajul “mesaj1”arataeq macro mesaj1 – afisaza mesaj formatat in caz ca rezultatul compararii celor 2 fisiere este egal. arataneq macro mesaj1 - afisaza mesaj formatat in caz ca rezultatul compararii celor 2 fisiere nu este egal. endl macro – trece cursorul pe urmatorul rand. Utilizata tot pentru formatare. eroare MACRO erm,er – afisaza mesajul de eroare “erm” si reseteaza variabila “er” la valoarea 0. Observatie: Toate macrodefinitiile care pot genera erori au un parametru de eroare “er” care, dupa apelarea macrodefinitiei este verificat si astfel se observa daca macrodefinitia s-a rulat cu success.
Descrierea programului Pe parcursul programului au fost lasate comentarii pentru o intelegere usoara si pentru facilitarea unei eventuale modificari ulterioare.Programul realizeaza deschiderea fisierelor (“COMP1.TXT” si “COMP2.TXT”), pastrearea atributelor in variabilele “atrb” si “atrb1”, pozitionarea la sfarsit pentru determinarea lungimii si salvarea rezultatelor in variabilele “lungime” si “lungime2”. Dupa aceea se inchid fisierele si se deschid in mod read-only setand variabila modD pe 0. Dupa citirea celor 10 octeti din fisiere se face compararea si se afiseaza rezultatul citirii si al compararii. Daca vreun fisier nu poate fi deschis, acesta se creeaza dup ace a fost anuntat utilizatorul de aparitia erorii; daca nici crearea nu reuseste din nou utilizatorul e informat si se trece mai departe in program luand ca valori de comparative valorile setate default (lungime si attribute 0 si cei 10 octeti avand valoarea “”). Concluzii Programul realizeaza compararea celor 2 fisiere de intrare din 3 punce de vedere: Verificarea atributelor celor 2 fisiere Testarea egalitatii lungimii pentru ambele fisiere Compararea primilor 10 octeti din cele 2 fisiere Prin utilizarea bibliotecii de macrodefinitii se realizeaza un program compact, usor de citit si de inteles; comentariile puse la sfaritul liniilor reprezinta de asemenea un ajutor mai ales pentru utilizari urmatoare a codului. BIBLIOGRAFIE [ IVAN2000] Ion Ivan, Paul Pocalitu “Practica Dezvoltarii Software in Limbaje de Asamblare“, Editura Economica, Bucuresti, 2000 [ IVAN99] Laur Ivan “Programarea in Limbaje de Asamblar - culegere de probleme, Editura Inforec, Bucuresti, 1997 Gheorghe Musca, “Programare in limbaje de asamblare”, Editura Teora, Bucuresti, 1997 https://www.assembler.ase.ro/Documentatie Anexe “macrofis.asm” – biblioteca cu macrodefinitii;;macrointructiuni fisiere Creare MACRO Fhndl, er, Filen LOCAL eroare, sfarsit push ax push cx push dx mov er, 0 xor ax, ax mov ah, 3ch mov dx, offset Filen mov cx, 0 int 21h jc eroare mov Fhndl, ax jmp sfarsit
eroare: ; ax = 3 - adresa fisierului nu a fost gasita ; 4 - prea multe fisiere deschise ; 5 - acces nepermis mov er, ax mov FHndl, -1 sfarsit: pop dx pop cx pop ax endm Scriere MACRO FHndl,text,text_size,er LOCAL sfarsit push ax push bx push cx push dx mov er, 0 xor ax, ax mov ah, 40h mov bx, FHndl mov dx, offset text mov cx, text_size int 21h jnc sfarsit mov er, ax ; ax = 5 - acces nepermis ; 6 - handle invalid sfarsit: pop dx pop cx pop bx pop ax endm Deschidere MACRO Fhndl, Filen,modD, er LOCAL eroare, sfarsit push ax push dx mov er, 0 xor ax, ax mov ah, 3dh ;descidere fisier mov al, modD ;mod deschidere ( 0 - numai citire ,1 - numai scriere, 2 - scriere si citire ) lea dx, Filen ;adresa fisierului int 21h jc eroare mov FHndl, ax ;handle pentru fisier jmp sfarsit eroare: mov er, ax ; ax = 2 - fisierul nu a fost gasit ; 4 - prea multe fisiere deschise ; 5 - acces nepermis ; 12 - acces invalid sfarsit: pop dx pop ax endm Citire MACRO Buffer, lungimeCit, FHndl, er, buf LOCAL start, eroare, sfarsit start: push ax push bx push cx push dx push si xor si, si mov er, 0 xor ax, ax mov ah,3fh ;citirea datelor din fisier ( caracter cu caracter) lea dx, Buffer ;adresa buffer-ului mov cx, lungimeCit ;citeste un lungimea data din fisier mov bx, FHndl ;valoarea handle-lului fisierului int 21h jc eroare cmp ax, cx ;EOF ? jne sfarsit mov al, Buffer ;ia caracterul citit pentru afisare mov buf[si], al inc si ;putc ;afisare jmp start ;citirea urmatorului caracter eroare: mov er, ax ; ax = 5 - acces nepermis ; 6 - handle invalid sfarsit: pop si pop dx pop cx pop bx pop ax endm Citire2 MACRO Buffer, lungimeCit, FHndl, er LOCAL start, eroare, sfarsit start: push ax push bx push cx push dx ;push si ;xor si, si mov er, 0 xor ax, ax mov ah,3fh ;citirea datelor din fisier ( caracter cu caracter) lea dx, Buffer ;adresa buffer-ului mov cx, lungimeCit ;citeste un lungimea data din fisier mov bx, FHndl ;valoarea handle-lului fisierului int 21h jc eroare ;cmp ax, cx ;EOF ? ;jne sfarsit eroare: mov er, ax ; ax = 5 - acces nepermis ; 6 - handle invalid sfarsit: pop si pop dx pop cx pop bx pop ax endm Inchidere MACRO FHndl, er LOCAL eroare, sfarsit push ax push bx mov er, 0 mov bx, FHndl mov ah, 3eh ;inchiderea fisierului int 21h jnc sfarsit eroare: mov er, ax ; ax = 6 - handle invalid sfarsit: pop bx pop ax endm fSize MACRO FHndl,deplasare,tip_deplasare, er,lg LOCAL eroare, sfarsit push ax push bx push cx push dx push si mov er, 0 mov ah,42h mov al,tip_deplasare ; 0 - deplasare de la inceputul fisierului ; 1 - deplasare de la pozitia curenta a fisierului ; 2 - deplasarea se realizeaza de la sfarsitul fisierului minus valoarea xor dx, dx ; deplasarii xor cx, cx ;deplasare 0 mov bx, FHndl int 21h mov si,offset lg ;incarc offset variabila dubla add [si],ax adc [si+2],dx ;mov test1,ax jnc sfarsit ; ax = 1- functie invalida ; 6- handle invalid eroare: mov er, ax sfarsit: pop si pop dx pop cx pop bx pop ax endm ;Bit Meaning if equal to one ;0 File is a Read-Only file ;1 File is a hidden file ;2 File is a system file ;3 File is a volume label name ;4 File is a subdirectory ;5 File has been archived Atribute MACRO Filen, actiune, atrb,er LOCAL setAtt, nxt, getAtt,eroare, sfarsit push ax push cx push dx mov ah, 43h mov al, actiune mov dx, offset Filen cmp actiune, 0 je nxt setAtt: mov cx, atrb nxt: int 21h jc eroare ;cmp actiune, 0 je getAtt jmp sfarsit getAtt: mov atrb, cx jmp sfarsit eroare: mov er, ax sfarsit: pop dx pop cx pop ax endm ;;MACROINTRUCTIUNI SIRURI DE CARACTERE ;afisare mesaj arata MACRO mesaj1 push ax push dx xor dx,dx xor ax,ax lea dx,mesaj1 mov ah,09h int 21h pop dx pop ax endm arataneq macro mesaj1 arata linii2 endl arata mesaj1 endl arata stelute endl endm arataeq macro mesaj1 arata linii2 endl arata mesaj1 endl arata linii endl endm ;numarare lungime sir strlen MACRO sir,lung local et1, et2 push ax push si push cx xor cx,cx mov si,offset sir cld et1: lodsb ;incarca in al un caracter al sirului cmp al,'$' ;verifica daca s-a ajuns la sfarsitul sirului je et2 inc cx ;cx numara caracterele sirului jmp et1 et2: mov lung,cx pop cx pop si pop ax endm ;trec pe rand nou endl macro push ax push dx mov ah,02h mov dl,0dh ; CR - carriage return int 21h mov dl,0ah ; LF - line feed int 21h pop dx pop ax endm ;eroare eroare MACRO erm,er arata erm ;afisez ca a fost eroare endl mov er,0 ;setez eroarea pe 0 endm “compar.asm” – Programul principal .model large .stack 100h include macrofis.asm .data Filen1 db 'comp1.txt',0 Filen2 db 'comp2.txt',0 text db 'Acesta este un text',0 text1 db 10 dup(?),''$' text2 db 10 dup(?),''$' text_size = $-text buf db 10 DUp (?),'$' Fhndl dw ? buffer db 10 dup(?),'$' ; pentru macro citire ( buffer-ul in care se stocheaza caracterele citite ) modD db 2 ; pentru macro deschidere ( 0 - pentru citire ; 1 - pentru scriere; 2 - citit + scriere) er dw 0 tip_deplasare db 2 ; pentru macro fSize ( daca se seplaseaza de la inceput, de la pozitia curenta sau de la ; sfarsit) lungimeCit dw 1 ; pentru macro citire lungimea textului ce va fi citit deplasare dw 0 ; pentru macro fSize ( deplasarea in fisier) atrb dw 0 ; pentru macro atribute ( in atrb se stocheaza atribtele ) atrb1 dw 0 actiune db 0 ; pentru macro atribute ( 0- se obtin atributele; 1 - se modifica atributele) lungime dd 0 ;lungime fisier1 lungime2 dd 0 ;lungime fisier2 ok db 1 ;;mesaje deschid db 'Deschid fisierul $' mmod db ' in mod READ-ONLY$' creez db 'Creez fisierul negasit!$' citesc db 'Citesc primii 10 octeti din fisierul $' unu db '1$' doi db '2$' mprimiiocteti db 'Primii 10 octeti cititi din fisier sunt: '$' moctetieq db 'PRIMII 10 OCTETI DIN CELE 2 FISIERE SUNT IDENTICI$' moctetineq db 'PRIMII 10 OCTETI DIN CELE 2 FISIERE NU SUNT IDENTICI$' matrib db 'Verific atributele fisierului $' mlung db 'Compar lungimile celor 2 fisiere$' mlungeq db 'FISIERELE AU ACEIASI LUNGIME.$' mlungneq db 'FISIERELE NU AU ACEIASI LUNGIME.$' matribeq db 'FISIERELE AU ACELEASI ATRIBUTE.$' matribneq db 'FISIERELE NU AU ACELEASI ATRIBUTE.$' minchid db 'Inchid fisierul $',13h,10h mpoz db 'Ma pozitionez la sfarsitul fisierului $' ermsg db 'EROARE!$' erfile db 'EROARE! Fisierul nu a putut fi creat in directorul curent!$' linii db '-------- ----- ------ -------- ----- ------ ----- ----- ----$' ;mesaje folosite linii2 db '__________ ______ ____ __________ ______ ____ __________________$' ;pentru formatarea stelute db ' ** ** ** ** ** ** ** ** ** ** **********$' ;textelor de iesire .code start: mov ax,@data mov ds,ax mov es,ax xor ax, ax ;resetez ax arata deschid ;afisez mesaj de deschidere arata unu ;afisez numaru fisierului deschis endl ;rand nou mov er,0 ;resetez er Deschidere FHndl, Filen1,modD, er ;apel macro deschidere cmp er,0 jne j1 ;am facut asa pentru a evita saltul relativ jmp l1 j1: eroare ermsg,er arata creez endl Creare Fhndl, er, Filen1 Deschidere FHndl, Filen1,modD, er cmp er,0 je l1 eroare erfile,er l1: arata matrib arata unu endl Atribute Filen1, actiune, atrb,er cmp er,0 je l2 eroare ermsg,er jmp l3 l2: mov ax,atrb mov atrb1,ax ;salvez atributele primului fisier ;;aflu lungimea1 arata mpoz arata unu endl fSize FHndl,deplasare,tip_deplasare, er,lungime ;deplasare=0, tip_deplasare=2 (de la sfarsit) arata minchid arata unu endl Inchidere FHndl, er cmp er,0 je l3 eroare ermsg,er l3: arata deschid arata doi endl Deschidere FHndl, Filen2,modD, er cmp er,0 je et1 jmp next ;pt ca era distanta de JMP conditionat prea mare et1: jmp l4 next: eroare ermsg,er arata creez endl Creare Fhndl, er, Filen2 arata deschid arata doi endl Deschidere FHndl, Filen1,modD, er cmp er,0 je l4 eroare erfile,er l4: mov atrb,0 arata matrib arata doi endl Atribute Filen2, actiune, atrb,er cmp er,0 je l5 eroare ermsg,er l5: mov ax,atrb1 cmp atrb,ax je atrib_egale arataneq matribneq jmp l6 atrib_egale: arataeq matribeq ;jmp l6 l6: arata mpoz arata doi endl fSize FHndl,deplasare,tip_deplasare, er,lungime2 ;deplasare=0, tip_deplasare=2 (de la sfarsit) arata minchid arata doi endl Inchidere FHndl, er cmp er,0 je l7 ;s-a inchis fisierul2 eroare ermsg,er l7: arata mlung endl mov si,offset lungime mov di,offset lungime2 mov ax,[si] cmp ax,[di] jne neegal ;daca octetii inferiori sunt egali egal1: mov ax,[si+2] cmp ax,[di+2] jne neegal arataeq mlungeq jmp next2 neegal: arataneq mlungneq next2: arata deschid arata unu arata mmod endl mov modD,0 Deschidere FHndl, Filen1,modD, er mov tip_deplasare,0 mov deplasare,0 ;fSize FHndl,deplasare,tip_deplasare, er,lungime cmp er,0 jne er1 ;am facut asa pentru a evita saltul relativ jmp l21 er1: eroare ermsg,er l21: ;s-a deschis fisierul mov lungimeCit,10 arata citesc arata unu endl citire2 text1, lungimeCit, FHndl, er endl arata mprimiiocteti arata text1 endl arata minchid endl Inchidere FHndl, er cmp er,0 je next4 eroare ermsg,er next4: arata deschid arata doi arata mmod endl Deschidere FHndl, Filen2,modD, er cmp er,0 jne er2 ;am facut asa pentru a evita saltul relativ jmp l22 er2: eroare ermsg,er l22: ;s-a deschis fisierul mov lungimeCit,10 endl arata citesc arata doi endl citire2 text2, lungimeCit, FHndl, er arata mprimiiocteti arata text2 endl arata minchid endl Inchidere FHndl, er cmp er,0 je next42 eroare ermsg,er next42: ;compar mov ok,1 ;daca e setaa pe 1 caracterele curente sunt egale mov cx,10 mov si,offset text1 mov di,offset text2 compar: mov ah,[si] mov al,[di] cmp ah,al jne stop inc si inc di loop compar mov ok,1 arataeq moctetieq jmp gata stop: mov ok,0 arataneq moctetineq ;Size FHndl, deplasare, tip_deplasare, er ;Scriere FHndl, text, text_size,er ;Inchidere FHndl, er ;Deschidere Fhndl, Filen1,modD, er ;Citire Buffer, text_size, FHndl, er, buf gata: Inchidere FHndl, er mov ax,4c00h int 21h end start
|