Documente Academic
Documente Profesional
Documente Cultură
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