Tehnika Krstarice > Programiranje > Delphi - Korišćenje asemblera u objektnom Pascal-u (III deo)

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

30.09.2001.

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.

Preporučite ovaj članak

Članak još uvek nije ocenjen.