Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Calculatoare


Qdidactic » stiinta & tehnica » informatica » calculatoare
Masurarea gradului de egalitate a doua fisiere - limbaje de asamblare -



Masurarea gradului de egalitate a doua fisiere - limbaje de asamblare -


ACADEMIA DE STUDII ECONOMICE

FACULTATEA DE CIBERNETICa, STATISTICa si INFORMATICA ECONOMICA



limbaje de asamblare

-proiect -




Masurarea gradului de egalitate a doua fisiere



Bucuresti





Introducere



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 acestora


Mijloacele 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







Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright