Anzeigen: Delphi C++
Anzeigeeinstellungen

Verwendung des integrierten Assemblers

Aus RAD Studio XE2
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. Er besitzt die folgenden Funktionsmerkmale:

  • Ermöglicht Inline-Assembly-Anweisungen
  • Unterstützt alle Anweisungen in Intel Pentium 4, Intel MMX Extensions, Streaming SIMD Extensions (SSE) sowie 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-Prozeduren

Alternativ zur Verwendung des integrierten Assemblers können Sie Objektdateien linken, die als external deklarierte Prozeduren und Funktionen enthalten. Siehe external-Deklarationen für weitere Informationen. Wenn Sie in einer Anwendung externen Assembly-Quellcode verwenden möchten, sollten Sie ihn in Delphi neu erstellen oder zumindest mit dem Inline-Assembler neu implementieren.

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

Inhaltsverzeichnis

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 Strichpunkte, Zeilenendezeichen oder Delphi-Kommentare voneinander getrennt werden.

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

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

Mit Registern arbeiten

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, 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 ABI (x64 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, XMM6, XMM7, XMM8, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14 und XMM15.

Die ersten vier Parameter für die Inline-Assembler-Funktionen werden über RCX, RDX, R8 bzw. R9 übergegeben, 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 (Delphi)#Vordefinierte Bedingungen.

Siehe auch

Frühere Versionen
In anderen Sprachen