You are on page 1of 3

Asamblarea programelor

Motto:
'Assembly is the language that before you can shoot yourself in the foot you have to
invent the gun, hand, leg, and foot.'

In aceasta lucrare dorim sa transcriem un program in sursa pentru TASM. TASM vine de
la TURBO assembler si este un compilator de assembler care ne ofera diferite facilitati,
de la evidenta adreselor, pana la optimizarea codului (?!). Principalele avantaje sunt
posibilitatea scrierii codului intr-un editor civilizat (nu ca la arhaicul debug) si calculare
automata a adreselor de memorie. Momentan vom transcrie programul si vom da o
explicatie scurta la fiecare linie. TASM este mult mai complex decat il voi prezenta aici,
dar il voi prezenta mai pe larg pe parcurs. Iata codul:

.model tiny

.code

org 100h

start:

mov dx, offset text

mov ah, 09h

int 21h

mov ax, 4c00h

int 21h

text db 'Hello World!$'

end start

Parca nu exista modificari majore, nu ? Totusi iata ce a aparut:

.model tiny

Linia aceasta se pune la inceputul codului si explica compilatorului ca programul


care intentionam noi sa-l facem este un program care isi pastreaza toate datele (codul,
stack, buffer, date suplimentare) intr-un singur segment de memorie. Toate programele
com sunt model tiny (mai exista modelele small, medium, large, huge, dar acestea sunt
pentru fisiere exe). Eu personal sunt de parere ca ceea ce nu incape intr-un tiny n-ar
trebui programat in assembler, deci toate programele care le vom folosi ca exemple vor
fi model tiny.

.code

Aceasta linie explica compilatorului ca ceea ce va gasi el mai jos este codul
programului si va trebui sa-l trateze ca atare.

org 100h

Aceasta linie explica compilatorului ca noi vom intentiona sa compilam respectivul


program ca un fisier com. Fisierele com sunt incarcate de sistemul de operare direct in
memorie (asta inseamna ca un fisier com contine exact imaginea programului din
memorie in momentul executarii acestuia) intr-un segment liber de memorie, incepand
cu adresa 0100h. Deci noi va trebui sa spunem compilatorului ca prima instructiune are
adresa 0100h (si nu 0). Compilatorul necesita aceasta informatie pentru a calcula
adresele la care se afla datele si adresele de salt absolut.

start... end start

Indica inceputul si sfarsitul programului. Intre start si end start (sau ori ce alt label)
trebuie sa se afle toate functiile, subfunctiile, codul, date...etc a programului.
Apoi urmeaza codul. In cod, sigurul lucru ciudat exte acel mov dx, offset text. Daca
ne uitam mai jos, vedem ca textul nostru a primit un label (text). Deci practic ceea ce
am zis noi se traduce in: pune in DX adresa (offset se traduce mai degraba ca 'la ce
distanta de mine') textului text. Deci, in loc sa calculam noi unde se afla respectivul text
(cum am facut pana acum) compilatorul face asta pentru noi.
Acum cred ca am sa abandonez Hello World, pentru ca deja am invatat destule pe
spinarea lui. Urmatorul program care il propun va face urmatoarele: va primi in linia de
comanda 1 argument (o parola). Apoi va citi datele de la tastatura (fisier) si le va
encripta folosind parola si va scrie pe ecran (fisier) rezultatul (vom privi tastatura ca un
fisier si ecranul tot ca un fisier pentru ca intrarea si iesirea pot fi redirectionate).
La acest program apar mai multe probleme. De exemplu, cum aflam ce a primit
programul in linia de comanda:
Poate va ganditi ca exista o functie speciala pentruasa cea... s-ar putea, dar eu nu
o cunosc. Dar ceea ce cunosc este ca sistemul de operare creaza inainte sa execute un
program un Program Segment Prefix lung de 100h bytes (h de la HEXA). N-am sa va
spun ce contine acest PSP pentru ca gasesti aceste lucruri in carti de scoala. Ce am sa
va spun este ca in byteul 80h se afla lungimea argumentului primit de program
(normal, in hexa) si incepand cu byteul 81h (pana la 100h)se afla chiar argumentul.
Deci ceea ce trebuie sa faca programul nostru pentru a afla argumentul cu care a fost
lansat, este sa citeasca byteul 80h si sa citeasca atatea caractere din memorie,
incepand cu 81h.
O alta problema ar fi, cum se citesc fisierele (tastatura).
Ultima problema ar fi metoda de encryptare a fisierului. Sa nu va imaginat ca acum
o sa aflati algoritmul blowfish sau ecryptarea PGP... Am decis sa folosesc o metoda
'didactica', care are si avantajul ca este reversibila folosind acelasi program (respecitv
mai rulati programul o data pe fisierul criptat, cu aceeasi cheie si obtineti fisierul
original). Aceasta metoda minune este metoda xor ('SAU EXCLUSIV') si se invata in
clasa a 9-a (?!) capitolul logica matematica. Voi indica un tabel cu actiunea comenzii
xor. (De mentionat ca xor acctioneaza la nivel de bit, deci tabelul se refera la biti):

You might also like