Delphi – Korišćenje asemblera u objektnom Pascal-u (III deo)

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