Programmierkurs: Delphi: Assembler und Delphi
Assembler und Delphi
[Bearbeiten]Allgemeines
[Bearbeiten]In Delphi wird der Assemblerteil immer mit asm
eröffnet und mit dem obligatorischen end
geschlossen. Die Register edi, esi, esp, ebp und ebx müssen innerhalb des Assemblerteils unverändert bleiben! Will man sie trotzdem verwenden, muss man sie vorher auf dem Stack ablegen:
push edi
push esi
push esp
push ebp
push ebx
Und am Ende der Assembler-Anweisungen wieder zurückholen:
pop ebx
pop ebp
pop esp
pop esi
pop edi
Syntax
[Bearbeiten]Es können wahlweise Assemblerblocks mit Delphicode vermischt werden, oder ganze Prozeduren/Funktionen in Assembler verfasst werden.
Beispiel für Assembler-Funktion
function Add(a, b: Integer): Integer; assembler; asm mov eax, a add eax, b end;
Das Schlüsselwort assembler ist hierbei nicht verpflichtend.
Beispiel für Assembler in Delphi
function Add(a, b: Integer): Integer; begin asm mov eax, a add b, eax end; result := b; end;
Anstatt die Parameter selbst in die einzelnen Register zu schieben, kann man diese auch direkt verwenden. Die Parameter werden nämlich auf den Registern gespeichert, der erste Parameter auf EAX, der zweite auf EDX und der dritte auf ECX. Außerden kann man als Result das Register EAX verwenden. Demnach könnte die Funktion oben folgendermaßen aussehen:
function Add(a, b: Integer): Integer; begin asm add eax, edx end; end;
In der Regel wird in Assembler-Abschnitten nicht mehr als ein Befehl pro Zeile untergebracht. Mehrere Befehle können durch ein Semikolon oder einem Kommentar voneinander getrennt werden.
Assembler-Zeile:
[Label] [Befehl] [Operand(en)]
Beispiele:
xor eax, eax
mov variable, eax
xor eax, eax; mov variable, eax
xor eax, eax {eax leeren} mov variable, eax
Alle drei Varianten sind gleichwertig, die erste Variante mit einem Befehl pro Zeile ist jedoch die übliche und sollte vorgezogen werden. Kommentare dürfen in Assembler-Blocks nie zwischen Befehl und Operanden stehen, zwischen Label und Befehl jedoch schon.
Labels müssen als lokale Labels definiert sein:
@xxx: { ... } jmp @xxx
Einige unterstützte Befehle gibt es in der Delphi-Hilfe unter dem Index „Assembler-Anweisungen“. Der integrierte Assembler unterstützt die Datentypen Byte(db), Word(dw) und DWord(dd), ein Pointer entspricht einem DWord. Wenn Sie eine Variable deklarieren, die denselben Namen hat wie ein reserviertes Wort, dann hat das reservierte Wort Vorrang. Auf die deklarierte Variable kann durch Voransetzen eines kaufmännischen Unds zugegriffen werden:
var ax: Integer; asm mov ax, 4 {verändert das Register ax} mov &ax, 4 {verändert die Variable ax} end;
DLL-Programmierung | Inhaltsverzeichnis | Warum eine RAD-Umgebung |