Programowanie w języku Delphi

Asm

asm - słowo kluczowe języka Delphi

Słowo kluczowe <b>asm</b> umożliwia wstawienie do programu (ew. podprogramu) kodu asemblera. Taki kod często nazywany jest wstawką asemblera.

Słowo kluczowe asm nie jest dostępne w Delphi dla .NET

program Foo;
 
{$APPTYPE CONSOLE}
 
begin
  asm
    { tutaj kod Assemblera }
  end;
end.


Kod asemblera można również umieścić w procedurze - ba, można nawet procedurę napisać w calości w asemblerze:
procedure DoNothing;
asm
  nop
end;


Kod w bloku <b>asm</b> komentuje się tak samo jak kod w Delphi - podwójnym ukośnikiem lub wewnątrz klamr, a nie jak w przypadku kompilatorów asemblera średnikiem, który tutaj służy do rozdzielania poleceń asemblera napisanych w jednej linii. Komentarze nie mogą znajdować się wewnątrz instukcji asemblera.

Liczby w systemach innych niż dziesiętny zapisywać można podając pierwszą literę nazwy systemu za właściwą liczbą, przy czym liczby szesnastkowe zaczynające się cyframi A-F muszą być poprzedzone zerem, np. 10010101b (binarny), 0FADEFACEh (<abbr title="heksadecymalny">hex</abbr>), czy 666o (oktalny). Liczby szesnastkowe można zapisywać również zgodnie ze składnią Pascala - $deadbeef.

Etykiety we wstawce asemblera muszą być zadeklarowane w sekcji <b>label</b>. Wyjątkiem są tzw. etykiety lokalne, których nazwy zaczynają się znakiem @ i nie można się do nich odwoływać poza wstawką, w której umieszczono etykietę lokalną.

Na początku wykonywania kodu asemblera rejestr ESP wskazuje na wierzch stosu, a EBP na aktualną ramkę stosu. Wartości pozostałych rejestrów są osobliwe (nieprzewidywalne)1. Po wykonaniu kodu asemblera rejestry EDI, ESI, ESP, EBP i EBX muszą pozostać niezmienione, rejestry EAX, ECX i EDX można modyfikować swobodnie.

Miejsce przechowywania rezultatu funkcji asemblerowej zależy od typu rezultatu:
  • Wskaźniki (w tym łańcuchy AnsiString i WideString) i wartości porządkowe zwracane są do rejestru akumulatora (EAX, AX lub AL).
  • Wartości Int64 zwracane są do pary rejestrów - EDX i EAX (EDX - starszy dword, EAX - młodszy)
  • Liczby rzeczywiste zwracane są do stosu koprocesora numerycznego - ST(0) (liczby typu Currency muszą być pomnożone przez 10000)
  • Rezultaty wariantowe (wartośtypu Variant), odwołania do interfejsów oraz łańcuchy ShortString przechowywane są w lokalizacji tymczasowej, do której można odwołać się poprzez wskaźnik @Result.

Zobacz też:

[1] Dla podprogramów (procedur i funkcji) napisanych w całości w asemblerze i mających konwencję wywołania register nie jest to prawdą - w rejestrach znajdują się argumenty.

3 komentarze

Kooba 2006-08-09 18:16

no ok, fajny art, ale wypadało przy okazji usunac szablon "zalążek", w koncu nie po to on jest zeby zostawał na zawsze..

Jojersztajner 2006-08-09 17:57

Trochę się rozpisałem...

Przydałoby się to poprawić - i dobrze by też było, gdyby przenieść informacje o wstawkach asemblera do osobnego artykułu - bo przecież
<quote=Zasady redagowania artykułów>Jeżeli opisujesz znaczenie słowa kluczowego (np. Unit) nie pisz referatu na temat modułów. Wystarczy krótka informacja do czego służy to słowo kluczwe, notka o funkcjach modułu i jego budowie. W tekście natomiast dołącz link, wraz z informacją, że więcej informacji na ten temat, można znaleźć w artykule Moduły.</quote>

// @Kooba: zapomniałem [wstyd]

Adam Boduch 2006-01-19 14:41

Przydaloby sie napiasc cos wiecej o Assemblerze oraz oddac jakis przyklad kodu Asm.