Verwendung des integrierten Assemblers

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwendung des integrierten Assemblers - Index


Mit dem integrierten Assembler können Sie Assembly-Code direkt in Ihre Delphi-Programme einfügen. Der integrierte Assembler verfügt über folgende Funktionsmerkmale:

  • Ermöglicht Inline-Assembly-Anweisungen
  • Unterstützt alle Anweisungen in Intel Pentium 4, Intel MMX Extensions, Streaming SIMD Extensions (SSE) und AMD Athlon (einschließlich 3D Now!)
  • Unterstützt die Intel 64-Architektur mit einigen Einschränkungen
  • Ermöglicht die Verwendung von Delphi-Bezeichnern, wie etwa Konstanten, Typen und Variablen in Assembly-Anweisungen
  • Keine Makrounterstützung, ermöglicht jedoch reine Assembly-Funktionsprozeduren

Alternativ zur Verwendung des integrierten Assemblers können Sie Objektdateien linken, die als external deklarierte Prozeduren und Funktionen enthalten. Im Thema Externe Deklaration finden Sie weitere Informationen. Wenn Sie in einer Anwendung externen Assembly-Quellcode verwenden möchten, sollten Sie ihn in Delphi neu schreiben oder zumindest mit dem Inline-Assembler neu implementieren.

Der Inline-Assembler ist verfügbar für:

Der Inline-Assembler wird jedoch nicht von den Delphi-Compilern für iOS- und Android-Geräte unterstützt.

Die Anweisung asm

Auf den integrierten Assembler greifen Sie über asm-Anweisungen zu, die folgende Syntax haben:

asm statementList end

statementList ist dabei eine Folge von Assembly-Anweisungen, die durch Semikolon, Zeilenendezeichen oder Delphi-Kommentare voneinander getrennt sind.

Kommentare in einer asm-Anweisung müssen dem Delphi-Stil entsprechen. Ein Semikolon gibt hier nicht an, dass es sich beim Rest der Zeile um einen Kommentar handelt.

Das reservierte Wort inline und die Direktive assembler wurden aus Gründen der Abwärtskompatibilität beibehalten. Sie haben keine Auswirkungen auf den Compiler.

Arbeiten mit Registern

X64 GPR.pngX64 SSE.png

32 Bit

Im Allgemeinen sind die Regeln für die Verwendung von Registern in einer asm-Anweisung identisch mit denjenigen für eine external-Prozedur oder -Funktion. In einer asm-Anweisung muss der Inhalt der Register EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register EAX, ECX und EDX beliebig geändert werden können. Beim Eintritt in eine asm-Anweisung zeigt EBP auf den aktuellen Stack-Frame und ESP auf den Beginn des Stacks. Zu Beginn der Ausführung einer asm-Anweisung ist der Registerinhalt unbekannt. Eine Ausnahme bilden die Register ESP und EBP.

64 Bit

Entsprechend dem x64-ABI (Application Binary Interface) muss der Inhalt der folgenden Register erhalten bleiben und mit Inline-Assembly-Funktionen wiederhergestellt werden: R12, R13, R14, R15, RDI, RSI, RBX, RBP, RSP, XMM4, XMM5, XMM6, XMM7, XMM8, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14 und XMM15.

Die ersten vier Parameter für Inline-Assembler-Funktionen werden über RCX, RDX, R8 bzw. R9 übergeben, mit Ausnahme der Gleitkomma-Argumente, die XMMO, XMM1, XMM2, XMM3 verwenden. Der mathematische Coprozessor wird normalerweise nicht von x64-Code verwendet. Für Funktionsparameter verwendete Register können ohne Beschränkung geändert werden.

Verwenden von konditionalen Definitionen für plattformübergreifenden Code

Für vorhandene Funktionen mit Inline-Assembly-Code müssen zur Unterscheidung von Plattformen konditionale Definitionen verwendet werden. Funktionen sollten einen gemeinsamen Funktionsprototyp für verschiedene Plattformen haben. Beispiel:

function Power10(val: Extended; power: Integer): Extended; 
{$IFDEF PUREPASCAL}
begin
  // Pascal implementation here...
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
  asm
    // ASM implementation here...
  end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}

Beispiel ohne $ELSE:

  {$IFDEF CPUX86}
  asm
    // ...
  end;
  {$ENDIF CPUX86}
  {$IFDEF CPUX64}
  asm
    // ...
  end;
{$ENDIF CPUX64}

Weitere Informationen über vordefinierte Bedingungen finden Sie unter Bedingte Compilierung. Vordefinierte Bedingungen.

Siehe auch