; comentariu ; program de encryptare metoda xor ; (C)1997 IGu .model tiny .code org 100h start: ; aici facem rost de argumentul din linia de comanda xor cx, cx ;in momentul pornirii, cx!=0 mov bx, 0080h mov cl, [bx] ; punem in cl valoarea de la adresa 80h ; parantezele patrate indica facptul ca este vorba de valoarea de la adresa cmp cx, 1 ; daca cx <= 1 inseamna ca n-am primit argument jle eroare ; daca e mai mic sau egal (less or equal) iesim afara dec cl ; primul caracter este intotdeauna space, nu ne trebuie mov bx, 82h ; adresa primului caracter din argument (defapt este 81, dar sarim primul) transfer: mov dx, [bx] ; transferam characterul in registru mov [offset cheie + bx - 82h], dx ; si din registru in cheie inc bx ; trecemla urmatorul character loop transfer ; executam blocul pana cx=0, la fiecare trecere CX=CX-1 ; acum trebuie sa citim primul segment de date din infile si sa-l scirem in outfile ; citim citire: xor bx, bx ; fisierul intrare (tastatura) mov ah, 3fh ; functia citire mov cx, 00ffh ; citim 255 bytes odata mov dx, offset buffer ; unde citim int 21h ; dos service jc eroare ; daca e vreo problema iesim mov cx, ax ; nr de bytes cititi cmp cx, 0 ; daca este egal cu 0 je gata ; am ajuns la capat de fisier si am terminat push cx ; salvam in stack nr de bytes citit ;daca e ok, avem un buffer cu cx caractere de encryptat, deci xor dx, dx ; facem 0 repeta: xor bx, bx crypt: mov ah, [offset cheie+bx] ; un caracter din cheie in ax cmp ah , 0 ; daca ax este 0 am ajuns la sfarsitul cheii je repeta ; daca suntem la sfarsitul cheii, ciclam cheia push bx push dx pop bx mov al, [offset buffer+bx] ; un caracter din buffer xor al, ah ; encryptam mov [offset buffer + bx], al ; punem caracterul inapoi in buffer push bx pop dx pop bx inc bx ; bh=bh+1 inc dx ; bl=bl+1 loop crypt ; pana e cryptat tot bufferul ;scriem bufferul in fisier pop cx ; aducem din stack numarul de caractere din buffer mov ah, 40h ; functia scriere mov bx, 0001h ; fisierul iesire (ecran) mov dx, offset buffer ; datele de scris int 21h ; executam jc eroare cmp ax, cx ; comparam daca numarul de caractere scrise este egal cu cel comandat jne eroare ; daca nu este egal, zburam (disc plin ?) jmp citire gata: mov al, 00 ; cod de iesire ok ; se pare ca am terminat exit: mov ah, 4ch int 21h ; exit eroare: push ax ; salvam codul de eroare mov ah, 09h ; display eroare mov dx, offset errtext ; textul de eroare int 21h pop ax jmp exit ; am plecat ; alocam spatiu pentru cheie si buffer cheie: db 129 dup (0) ;129 bytes alocati pentru cheie buffer: db 256 dup (0) ;255 pentru buffer errtext db 'Eroare fatala !$' end start