Übersicht über x64-Aufrufkonventionen
Aktualisiert: November 2007
Zwei wichtige Änderungen in x64 gegenüber x86 sind die 64-Bit-Adressierbarkeit und ein pauschaler Satz von 16 64-Bit-Registern zur allgemeinen Verwendung. Aufgrund des erweiterten Registersatzes verwendet x64 nur die __fastcall-Aufrufkonvention und ein RISC-basiertes Ausnahmebehandlungsmodell. Das __fastcall-Modell verwendet für die ersten vier Argumente Register und zur Übergabe der anderen Parameter den Stapelrahmen.
Mit der folgenden Compileroption können Sie die Anwendung für x64 optimieren:
Aufrufkonvention
Das x64-ABI (Application Binary Interface) ist eine Aufrufkonvention mir vier Registern für Schnellaufrufe mit Stapelsicherung für die Register. Es gibt eine strenge 1:1-Entsprechung zwischen den Argumenten in einer Funktion und den Registern für diese Argumente. Argumente, die größer als 8 Bytes sind, bzw. deren Länge nicht 1, 2, 4 oder 8 Bytes entspricht, müssen als Verweis übergeben werden. Es wird nicht versucht, ein einzelnes Argument auf mehrere Register zu verteilen. Der x87-Registerstapel wird nicht verwendet. Er kann verwendet werden, ist aber zwischen Funktionsaufrufen als flüchtig zu betrachten. Alle Gleitkommaoperationen werden mithilfe der 16 XMM-Register durchgeführt. Die Argumente werden in den Registern RCX, RDX, R8 und R9 übergeben. Wenn die Argumente vom Format float/double sind, werden sie in XMM0L, XMM1L, XMM2L und XMM3L übergeben. 16-Byte-Argumente werden als Verweis übergeben. Die Parameterübergabe wird ausführlich unter Parameterübergabe beschrieben. Zusätzlich zu diesen Registern sind RAX, R10, R11, XMM4 und XMM5 flüchtig. Alle anderen Register sind nicht flüchtig. Die Verwendung von Registern ist in Registerverwendung und Gespeicherte Register von Aufrufer/Aufgerufenem ausführlich dokumentiert.
Der Aufrufer ist verantwortlich für die Reservierung von Speicherplatz für die an den Aufgerufenen zu übergebenden Parameter und muss stets genügend Speicher für die 4 Registerparameter reservieren, auch wenn der Aufgerufene weniger Parameter hat. Dies dient einfach der Unterstützung von C-Funktionen ohne Prototypen und vararg-Funktionen in C/C++. Für vararg-Funktionen und Funktionen ohne Prototypen müssen alle float-Werte im entsprechenden Allzweckregister dupliziert werden. Vor dem Aufruf müssen alle Parameter, die über die ersten vier hinausgehen, auf dem Stapel oberhalb des Sicherungsspeichers für die ersten vier gespeichert werden. Ausführliche Informationen zu vararg-Funktionen finden Sie unter VarArgs. Ausführliche Informationen zu Funktionen ohne Prototyp finden Sie unter Funktionen ohne Prototyp.
Ausrichtung
Die meisten Strukturen werden gemäß ihrer natürlichen Ausrichtung ausgerichtet. Hauptsächliche Ausnahmen sind die Stapelzeiger und der malloc- oder alloca-Speicher, die zur Leistungsverbesserung auf 16 Bytes ausgerichtet werden. Eine Ausrichtung auf mehr als 16 Bytes muss manuell erfolgen. Da jedoch 16 Bytes eine verbreitete Ausrichtungsgröße für XMM-Operationen ist, sollte dies für die meisten Fälle ausreichen. Weitere Informationen zu Strukturlayout und Ausrichtung finden Sie unter Typen und Speicher. Informationen zum Stapellayout finden Sie unter Verwendung von Stapeln.
Entladbarkeit
Alle nicht verzweigenden Funktionen [Funktionen, die weder eine Funktion aufrufen noch selbst irgendwelchen Stapelspeicher reservieren] müssen mit Daten gekennzeichnet werden [diese werden als xdata oder ehdata bezeichnet, auf die pdata zeigen], die eine Beschreibung für das Betriebssystem enthalten, wie sie ordnungsgemäß zu entladen sind, um die nicht flüchtigen Register freizugeben. Prologe und Epiloge sind in hohem Maß beschränkt, damit sie ordnungsgemäß in xdata beschrieben werden können. In jedem Codebereich, der nicht Teil eines Epilogs oder Prologs ist, muss der Stapelzeiger auf 16 Bytes ausgerichtet werden, außer für Endfunktionen. Ausführliche Informationen über die richtige Struktur von Funktionsprologen und -epilogen finden Sie unter Prolog und Epilog. Weitere Informationen über Ausnahmebehandlung und Ausnahmebehandlung/Entladen von pdata und xdata finden Sie unter Ausnahmebehandlung (x64).