Programmierkurs: Delphi: Assembler und Delphi

Aus Wikibooks

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