Asm
Adam Boduch
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)[#]_. 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ż:
.. [#] 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.
no ok, fajny art, ale wypadało przy okazji usunac szablon "zalążek", w koncu nie po to on jest zeby zostawał na zawsze..
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ż
// @Kooba: zapomniałem [wstyd]
Przydaloby sie napiasc cos wiecej o Assemblerze oraz oddac jakis przyklad kodu Asm.