Asembler
Struktura programu
Język Turbo Pascal ma wbudowany tzw. asembler wewnętrzny (i o to chodzi), dzięki czemu nie musimy mieć specjalnego kompilatora. W tym rozdziale opiszę tylko jak powinien wyglądać kawałek kodu asemblerowego w Pascalu i parę ogólnych zasad konstruowania wstawek. Składnia asemblera jest bardzo prosta. Każde polecenie piszemy najlepiej w osobnej linijce i nawet nie musimy stawiać średników. Jeśli będziemy uparci, to co prawda można pisać wszystko w jednej linijce, jednak bez średników już się nie obędziemy. Aby kompilator wiedział, z czym ma do czynienia musimy mu to oświadczyć korzystając ze słówka kluczowego asm. Wzorcowy programik wygląda tak:

  asm
    polecenie_1
    polecenie_2
    polecenie_3
  end;			{kończymy end'em}

W przeciwieństwie do Pascala w asmie bardzo często stosuje się etykiety. Konstruuje się je nawet podobnie, a odnosi za pomocą instrukcji jmp (jak jump) - odpowiednika pascalowej goto. Tutaj jednak nie musimy deklarować etykiety na początku programu. Można to zrobić (i tak się robi) na końcu, jednak wtedy przed nazwą etykiety musi stać @. Może trochę to zakręcone ale popatrz:

  asm
    polecenie_1
    polecenie_2
    jmp etykieta        {tutaj program przeskoczy do etykiety}
    polecenie_3		{czyli to polecenie nie zostanie wykonane}
   @etykieta:
    polecenie_4		{a tutaj mamy treść etykiety}
  end;

W tym przypadku polecenie_3 nigdy nie zostanie wykonane. Później nauczymy się uwarunkowywać skakanie do etykiet, a wtedy będzie możliwa sytuacja, gdzie skok nie zostanie wykonany, a program zrealizuje polecenie_3. Jako ćwiczenie napiszemy teraz procedurę, która będzie jednocześnie przykładem rekurencji:

  procedure loop;
  begin
    asm
     @etykieta:
      jmp etykieta
    end
  end.

Co się stanie? Wiadomo. Ponieważ etykieta będzie ciągle wywoływać samą siebie, procedura nigdy się nie zakończy. Zaraz, ale sam jej zapis wygląda trochę nieładnie. Aż by się chciało wyrzucić begin'a i end'a ale czy to możliwe. Oczywiście, że tak! Skoro wiemy, że cały kod jest napisany w asemblerze to możemy te dwa słowa kluczowe pominąć pod warunkiem, że powiemy o tym kompilatorowi. Używamy do tego celu dyrektywy assembler:

  procedure loop; assembler;  {kompilatorze! ta procedura jest cała}
  asm			      {napisana w asemblerze. możesz pominąć}
   @etykieta:  		      {begin oraz end!}	
    jmp etykieta
  end.

Oczywiście jeśli tylko fragment jest napisany w asmie to nie możemy stosować tego chwytu. Powyższa procedura w 'czystym' Pascalu wyglądałaby tak:

  procedure loop;
  label etykieta;
  begin
    etykieta:
     goto etykieta;
  end.

Obie będą działać tak samo jednak wersja asemblerowa będzie na pewno szybsza (choć i tak nie da się w tym przypadku tego zauważyć), a jest nie mniej czytelna. Wstawki asemblerowe są naprawdę pomocne. Sam to przyznasz choćby przy tworzeniu grafiki, gdzie czas trwania procedury ma olbrzymie znaczenie.
Hmm... Wygląda na to, że przeszliśmy przez całkiem trudny początek.


Copyright © 2000-2001 Bartosz 'SILV' Jaworski
All rights reserved