Kako kompajler (prevodilac) manipuliše brojnim varijablima? Svaki program koji kreirate sadrži veliki broj varijabli sa kojima kompajler mora da se izbori. Razmotrite sledeću Pascal liniju:
Brojac:=0;
Za kompajler, ovo je samo još jedna vrednost koju treba zapamtiti. Prema tome, „on“ za ovu varijablu određuje memorijski prostor, i da bi bio siguran da se kasnije neće zbuniti, ovom memorijskom prostoru daje simboličko ime „Brojac“. Kod bi bio sledeći:
mov eax,0
mov Brojac,eax
Kompajler ne bi mogao da koristi liniju koda kao što je sledeća:
mov Brojac,0
jer najmanje jedan parametar instrukcije mora da bude registar. Ukoliko razmotrimo sledeću liniju:
Brojac := Brojac + 1;
dobili bismo nešto slično ovome:
mov eax,Brojac
add eax,1
mov Brojac,eax
Kod varijabli drugačijeg tipa podataka, stvari stoje nešto kompleksnije.
Sada ćemo preći na kreiranje našeg prvog asemblerskog koda, unutar Delphi-ja. Možda je primer trivijalan, ali odnekle se mora započeti, zato pogledajte sledeću funkciju (objektni Pascal):
function Suma(X,Y:integer):integer;
begin
Rezultat := X+Y;
end;
Da bi asemblerski kod implementirali unutar koda objektnog Pascal-a, imamo na raspolaganju metodu uz pomoć bloka „asm…end“. Ponovo ćemo napisati prethodnu funkciju, ali uz pomoć asemblera:
function Suma(X,Y:integer):integer;
begin
asm
mov eax,X
add eax,Y
mov Rezultaz,eax
end;
end;
Ovaj kod je beznačajan, ali radi sigurno. Nemamo nekog uočljivog ubrzanja rada, a kod nam je postao nečitljiviji. Međutim, postoji primer gde možemo primeniti naše ograničeno poznavanje asemblera na nešto korisno. Recimo da želimo da eksplicitne vrednosti Crvene, Zelene i Plave boje u boje tipa TColor pogodne za korišćenje u Delphi-ju. Tip TColor opisuje 24-bitnu paletu koja se čuva u integer formatu od 4 bajta, najviši je nula, a ostali predstavljaju crvenu, zelenu i plavu vrednost.
function Boja(Crvena,Zelena,Plava:integer):TColor;
begin
asm
{registar ecx ce cuvati vrednosti TColor}
mov ecx,0
{startovanje sa crvenom komponentom}
mov eax,Crvena
{provera da li je crvena u intervalu 0<=Crvena<=255}
and eax,255
{smestanje vrednosti crvene na odgovaraj.poziciju}
shl eax,16
{podesavanje vrednosti TColor}
xor ecx,eax
{sve isto za zelenu komponentu}
mov eax,Zelena
and eax,255
shl eax,8
xor ecx,eax
{i za plavu}
mov eax,Plava
and eax,255
xor ecx,eax
mov Rezultat, ecx
end;
end;
Ovde ste mogli zapaziti i nekoliko binarnih operacija, koje su takođe definisane i u objektnom Pascal-u.
Pratite Krstaricu na www.krstarica.com