www.wikidata.de-de.nina.az
Unter Aufrufkonvention englisch calling convention versteht man die Methode mit der in Computerprogrammen einem Unterprogramm Daten ubergeben werden In der Regel liegt es am Compiler welche Konvention zum Einsatz kommt so dass der Programmierer sich nicht damit beschaftigen muss Bei der Entwicklung von Software in mehreren Sprachen ist es jedoch erforderlich dass alle Module kompatible Aufrufkonventionen verwenden Inhaltsverzeichnis 1 Aufrufkonventionen der x86 Architektur 1 1 cdecl 1 2 stdcall 1 3 Pascal 1 4 Register FastCall 1 5 thiscall 1 6 Ubersichtstabelle Aufrufkonventionen 2 EinzelnachweiseAufrufkonventionen der x86 Architektur BearbeitenDie x86 Architektur besitzt viele verschiedene Aufrufkonventionen 1 Wegen der begrenzten Zahl an Registern werden bei vielen x86 Aufrufkonventionen die Argumente uberwiegend uber den Stack ubertragen wahrend der Ruckgabewert oder ein Zeiger auf ihn uber ein Register zuruckgegeben wird Einige Konventionen nutzen Register fur die ersten Argumente was der Performance fur einfache haufig aufgerufene Funktionen zugutekommt z B Funktionen welche keine anderen aufrufen und in die dadurch nicht zuruckgekehrt wird cdecl Bearbeiten Die so genannte cdecl Aufrufkonvention wird von vielen C und C Compilern verwendet die auf der x86 Architektur laufen 2 Hierbei werden die Parameter nacheinander von rechts nach links auf den Stack gelegt Ruckgabewerte werden von der aufgerufenen Funktion in der Regel im EAX Register der CPU abgelegt Eine Ausnahme bilden Gleitkommazahlen die in ST0 abgelegt werden Die Register EAX ECX und EDX stehen fur die Verwendung innerhalb der Funktion zur Verfugung 3 Wenn daruber hinaus andere Register verwendet werden sollen muss der Inhalt dieser Register von der Funktion gesichert meist durch Ablegen auf den Stack und vor dem Rucksprung wiederhergestellt werden Beispiel in C Code int function int int int Prototyp der Funktion int a b c x Variablendeklaration x function a b c Funktionsaufruf Der Funktionsaufruf in der letzten Zeile erzeugt den folgenden x86 Assembler Code in MASM Syntax Argumente in umgekehrter Reihenfolge auf den Stack legen push c push b push a Funktion aufrufen call function Stack Pointer zurucksetzen add esp 12 Ruckgabewert der Funktion sichern mov x eax Der Aufrufer baut nach der Ruckkehr den Stack selbst wieder ab indem der Stack Pointer gespeichert im ESP Register so gesetzt wird dass er wieder auf die Position im Speicher zeigt auf die er vor den Push Operationen zeigte Im Beispiel oben werden drei Integer also 12 Bytes auf den Stack gelegt Da der Stack in x86 Systemen von oben nach unten wachst wird dabei ESP um 12 dekrementiert Um wieder auf die Position von vorher zu kommen muss im Anschluss an den Aufruf wieder 12 auf den Wert im ESP Register addiert werden So konnen auch Funktionen mit variabler Argumenten Anzahl und Lange realisiert werden Die cdecl Aufrufkonvention ist gewohnlich die Standard Aufrufkonvention eines x86 C Compilers Allerdings verfugen viele Compiler uber die Option eine andere Konvention zu verwenden Eine Funktion kann manuell mit folgender Syntax als cdecl Funktion deklariert werden int cdecl function int int int stdcall Bearbeiten Die stdcall Aufrufkonvention ist de facto die Standard Aufrufkonvention fur die Microsoft Win32 API 4 Funktionsparameter werden von rechts nach links ubergeben Die Register EAX ECX und EDX sind reserviert fur die Verwendung innerhalb der Funktion werden also unter Umstanden verandert Ruckgabewerte werden im EAX Register zuruckgegeben Anders als bei cdecl bereinigt die aufgerufene Funktion den Stack nicht der Aufrufer Wegen dieser Tatsache unterstutzen stdcall Funktionen keine variablen Argumentenlisten Beispiel Deklaration einer stdcall Funktion in C int stdcall function int int int Funktionen die die stdcall Methode benutzen sind in Assembler Code leicht zu erkennen da sie vor dem Rucksprung zum aufrufenden Code den Stack immer selbst abbauen Der x86 Befehl ret erlaubt einen optionalen Parameter der die Grosse des abzubauenden Stacks angibt Beispiel Beim Rucksprung 12 Byte von Stack entfernen ret 12 Pascal Bearbeiten Bei der Pascal Aufrufkonvention werden die Parameter im Gegensatz zur cdecl Konvention in der Reihenfolge von links nach rechts auf dem Stack abgelegt und die aufgerufene Funktion muss den Stack Pointer vor dem Rucksprung zum aufrufenden Code selbst zurucksetzen 2 Register FastCall Bearbeiten Die Register oder FastCall Aufrufkonvention ist compilerspezifisch 2 Im Allgemeinen besagt sie dass die ersten zwei oder drei Funktions Argumente mit einer Grosse von 32 Bit oder weniger in den Registern EAX EDX und moglicherweise auch ECX ubergeben werden anstatt uber den Stack Die ubrigen Argumente werden von rechts nach links auf dem Stack abgelegt ahnlich wie bei cdecl Der Borland und Delphi Compiler hingegen legen die ubrigen Argumente wie bei der Pascal Aufrufkonvention von links nach rechts auf dem Stack ab 5 Die Ruckgabewerte werden in den Registern AL AX oder EAX zuruckgegeben Bei x64 Systemen werden bis zu vier Argumente mit 64bit oder weniger in speziellen Registern ubergeben der Rest auf dem Stack Diese Konvention wird unter anderem im Linux Kernel benutzt um Argumente an System Calls zu ubergeben Die System Call Nummer die jeden moglichen Aufruf eindeutig bestimmt wird im EAX Register abgelegt wahrend alle Argumente an die Kernel Funktion in den Registern EBX ECX EDX ESI und EDI gespeichert werden Mussen mehr Argumente ubergeben werden wird einfach eine Datenstruktur mit den benotigten Elementen im Speicher abgelegt und ein Zeiger auf diese als Argument an die Funktion weitergereicht thiscall Bearbeiten Diese Aufrufkonvention wird fur den Aufruf nicht statischer C Member Funktionen benutzt Es gibt zwei Hauptversionen von thiscall die abhangig vom Compiler und abhangig davon benutzt werden ob die Funktion variable Argumentlisten unterstutzt oder nicht Beim GCC ist thiscall fast identisch mit cdecl der Aufrufer bereinigt den Stack und die Parameter werden von rechts nach links auf dem Stack abgelegt Der Unterschied liegt im this Zeiger der als letztes Argument auf dem Stack abgelegt wird so als ware er der erste zu ubergebende Parameter der Funktion Beim Microsoft Visual C Compiler wird der this Zeiger im ECX Register ubergeben und die aufgerufene Funktion bereinigt den Stack es wird also wie bei der stdcall Aufrufkonvention verfahren Werden hingegen variable Argumentlisten verwendet bereinigt der Aufrufer den Stack also wie bei cdecl Die thiscall Aufrufkonvention kann explizit nur bei Microsoft Visual C 2005 und spateren Versionen verwendet werden und ermoglicht den Aufruf von Elementfunktionen aus nativem Code heraus wenn Klassen standardmassig die clrcall Aufrufkonvention verwenden managed code Ubersichtstabelle Aufrufkonventionen Bearbeiten Architektur Aufrufkonvention Betriebssystem Compiler Parameter in Registern Parameterreihenfolge auf dem Stack Stack wird aufgeraumt von Ruckgabeparameter Kommentar16bit cdecl C callerpascal Pascal functionfastcall Microsoft non member ax dx bx Pascal function return pointer in bxfastcall Microsoft member function ax dx Pascal function this auf der niedrigen Stack Address return pointer in axfastcall Borland ax dx bx Pascal function this auf der niedrigen Stack Address return ptr auf der oberen Stack AddressWatcom ax dx bx cx C function return pointer in si32bit cdecl C callerGNU Compiler C hybrid Stack moglicherweise auf 16 aligned fastcall Microsoft ecx edx C function return pointer auf dem Stack falls nicht member functionfastcall Gnu ecx edx C functionfastcall Borland eax edx ecx Pascal functionthiscall Microsoft ecx C function default fur member functionsWatcom eax edx ebx ecx C function return pointer in esi64bit Microsoft x64 calling convention 6 Windows Microsoft Compiler Intel Compiler rcx xmm0 rdx xmm1 r8 xmm2 r9 xmm3 C caller Stack aligned auf 16 32 bytes shadow space auf dem stack Die spezifizierten 8 Register konnen nur fur Parameter 1 2 3 und 4 verwendet werden z B entweder rcx oder xmm0 aber nicht beide deswegen insgesamt nur 4 AMD64 ABI convention 7 Linux BSD Mac Gnu Compiler Intel Compiler rdi rsi rdx rcx r8 r9 xmm0 7 C caller Stack aligned auf 16 Red zone unter dem Stack 2 Einzelnachweise Bearbeiten Raymond Chen The history of calling conventions part 1 The Old New Thing 2 Januar 2004 abgerufen am 26 September 2010 englisch a b c d Agner Fog Calling conventions for different C compilers and operating systems PDF 416 kB 16 Februar 2010 abgerufen am 30 August 2010 englisch IBM Developing COBOL and PL I applications for Windows CDECL Stand 7 Dezember 2008 stdcall msdn microsoft com 16 Februar 2010 abgerufen am 24 September 2010 englisch Aufrufkonventionen in Delphi x64 calling convention Microsoft 3 August 2021 abgerufen am 6 Dezember 2021 englisch Michael Matz Jan Hubicka Andreas Jaeger and Mark Mitchell System V Application Binary Interface AMD64 Architecture Processor Supplement Advanced Micro Devices 3 September 2010 englisch Online PDF abgerufen am 26 September 2010 Online Memento des Originals vom 16 Juli 2011 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot www x86 64 org Abgerufen von https de wikipedia org w index php title Aufrufkonvention amp oldid 233513852