Aufrufkonvention

Unter Aufrufkonvention (englisch calling convention) versteht man die Methode, mit der in Computerprogrammen einem Unterprogramm Daten übergeben werden. In der Regel liegt es am Compiler, welche Konvention zum Einsatz kommt, so dass der Programmierer sich nicht damit beschäftigen muss. Bei der Entwicklung von Software in mehreren Sprachen ist es jedoch erforderlich, dass alle Module kompatible Aufrufkonventionen verwenden.

Aufrufkonventionen der x86-Architektur

Die x86-Architektur besitzt viele verschiedene Aufrufkonventionen.[1] Wegen der begrenzten Zahl an Registern werden bei vielen x86-Aufrufkonventionen die Argumente überwiegend über den Stack übertragen, während der Rückgabewert (oder ein Zeiger auf ihn) über ein Register zurückgegeben wird. Einige Konventionen nutzen Register für die ersten Argumente, was der Performance für einfache, häufig aufgerufene Funktionen zugutekommt (z. B. Funktionen, welche keine anderen aufrufen und in die dadurch nicht zurückgekehrt wird).

cdecl

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. Rückgabewerte 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 für die Verwendung innerhalb der Funktion zur Verfügung.[3] Wenn darüber hinaus andere Register verwendet werden sollen, muss der Inhalt dieser Register von der Funktion gesichert (meist durch Ablegen auf den Stack) und vor dem Rücksprung 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 zurücksetzen
add esp, 12

; Rückgabewert der Funktion sichern
mov x, eax

Der Aufrufer baut nach der Rückkehr 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 wächst, 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 können auch Funktionen mit variabler Argumenten-Anzahl und Länge realisiert werden.

Die cdecl-Aufrufkonvention ist gewöhnlich die Standard-Aufrufkonvention eines x86-C-Compilers. Allerdings verfügen viele Compiler über 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

Die stdcall-Aufrufkonvention ist de facto die Standard-Aufrufkonvention für die Microsoft Win32-API.[4] Funktionsparameter werden von rechts nach links übergeben. Die Register EAX, ECX, und EDX sind reserviert für die Verwendung innerhalb der Funktion, werden also unter Umständen verändert. Rückgabewerte werden im EAX-Register zurückgegeben. Anders als bei cdecl bereinigt die aufgerufene Funktion den Stack, nicht der Aufrufer. Wegen dieser Tatsache unterstützen 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 Rücksprung zum aufrufenden Code den Stack immer selbst abbauen. Der x86-Befehl ret erlaubt einen optionalen Parameter, der die Größe des abzubauenden Stacks angibt.

Beispiel: Beim Rücksprung 12 Byte von Stack entfernen.

ret 12

Pascal

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 Rücksprung zum aufrufenden Code selbst zurücksetzen.[2]

Register (FastCall)

Die Register- oder FastCall-Aufrufkonvention ist compilerspezifisch.[2] Im Allgemeinen besagt sie, dass die ersten zwei oder drei Funktions-Argumente mit einer Größe von 32 Bit oder weniger in den Registern EAX, EDX, und möglicherweise auch ECX übergeben werden anstatt über den Stack. Die übrigen Argumente werden von rechts nach links auf dem Stack abgelegt, ähnlich wie bei cdecl. Der Borland- und Delphi-Compiler hingegen legen die übrigen Argumente wie bei der Pascal-Aufrufkonvention von links nach rechts auf dem Stack ab.[5] Die Rückgabewerte werden in den Registern AL, AX, oder EAX zurückgegeben. Bei x64-Systemen werden bis zu vier Argumente mit 64bit oder weniger in speziellen Registern übergeben, der Rest auf dem Stack.

Diese Konvention wird unter anderem im Linux-Kernel benutzt, um Argumente an System-Calls zu übergeben. Die System-Call-Nummer, die jeden möglichen Aufruf eindeutig bestimmt, wird im EAX-Register abgelegt, während alle Argumente an die Kernel-Funktion in den Registern EBX, ECX, EDX, ESI und EDI gespeichert werden. Müssen mehr Argumente übergeben werden, wird einfach eine Datenstruktur mit den benötigten Elementen im Speicher abgelegt und ein Zeiger auf diese als Argument an die Funktion weitergereicht.

thiscall

Diese Aufrufkonvention wird für den Aufruf nicht-statischer C++-Member-Funktionen benutzt. Es gibt zwei Hauptversionen von thiscall, die abhängig vom Compiler und abhängig davon benutzt werden, ob die Funktion variable Argumentlisten unterstützt 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 wäre er der erste zu übergebende Parameter der Funktion.

Beim Microsoft Visual C++ Compiler wird der this-Zeiger im ECX-Register übergeben 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 späteren Versionen verwendet werden und ermöglicht den Aufruf von Elementfunktionen aus nativem Code heraus, wenn Klassen standardmäßig die clrcall-Aufrufkonvention verwenden (managed code).

Übersichtstabelle Aufrufkonventionen

Architektur Aufrufkonvention Betriebssystem, Compiler Parameter in Registern Parameterreihenfolge auf dem Stack Stack wird aufgeräumt von... Rückgabeparameter, Kommentar
16bit cdecl C caller
pascal Pascal function
fastcall Microsoft (non-member) ax, dx, bx Pascal function return pointer in bx
fastcall Microsoft (member function) ax, dx Pascal function "this" auf der niedrigen Stack-Address. return pointer in ax
fastcall Borland ax, dx, bx Pascal function "this" auf der niedrigen Stack-Address. return ptr auf der oberen Stack-Address
Watcom ax, dx, bx, cx C function return pointer in si
32bit cdecl C caller
GNU-Compiler C hybrid Stack möglicherweise auf 16 aligned.
fastcall Microsoft ecx, edx C function return pointer auf dem Stack falls nicht member function
fastcall Gnu ecx, edx C function
fastcall Borland eax, edx, ecx Pascal function
thiscall Microsoft ecx C function default für member functions
Watcom eax, edx, ebx, ecx C function return pointer in esi
64bit 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 können nur für 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

  1. Raymond Chen: The history of calling conventions, part 1. The Old New Thing, 2. Januar 2004, abgerufen am 26. September 2010 (englisch).
  2. 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).
  3. IBM: Developing COBOL and PL/I applications for Windows, CDECL (Stand: 7. Dezember 2008)
  4. ___stdcall. msdn.microsoft.com, 16. Februar 2010, abgerufen am 24. September 2010 (englisch).
  5. Aufrufkonventionen in Delphi
  6. x64 calling convention. Microsoft, 3. August 2021, abgerufen am 6. Dezember 2021 (englisch).
  7. 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)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.x86-64.org

Read other articles:

Fifth-largest city in Albania This article is about the city in Albania. For other uses, see Shkodër. Municipality and city in Northern Albania, AlbaniaShkodër ScodraScutariMunicipality and cityFrom top to bottom, left to right: View of Shkodër, Ebu Beker Mosque, Kolë Idromeno Street, Rozafa Castle, Franciscan Church from Kolë Idromeno Street, Drin Delta and Lake of Shkoder with the Albanian Alps. FlagSealShkodërShow map of AlbaniaShkodërShow map of EuropeCoordinates: 42°04′05″N 1...

 

Shopping mall in Texas, U.S.Collin Creek MallOutside of the Collin Creek Mall in 2019LocationPlano, Texas, U.S.Opening dateJuly 29, 1981; 42 years ago (1981-07-29)Closing dateJuly 31, 2019; 4 years ago (2019-07-31)OwnerCenturion AmericanNo. of stores and services0No. of anchor tenants5 (0 open, 5 vacant)No. of floors2Websitecollincreekmall.com Collin Creek Mall was a two-level, enclosed regional mall in Plano, Texas opened in 1981 and closed for redevelopme...

 

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article may need to be rewritten to comply with Wikipedia's quality standards. You can help. The talk page may contain suggestions. (September 2019) This article may be in need of reorganization to comply with Wikipedia's layout guidelines. Please help by editing the article to make improvements to the overall structure. (September 2019...

px Dalam kalkulus, teorema Rolle pada dasarnya menyatakan fungsi terdiferensialkan dan kontinu, yang memiliki nilai sama pada dua titik, mestilah memiliki titik stasioner yang terletak di antara kedua titik tersebut. Pada titik stasioner ini, gradien garis singgung terhadap fungsi tersebut sama dengan nol. Versi standar Bila sebuah fungsi riil f kontinu pada selang tertutup [a, b], terdiferensialkan pada selang terbuka (a, b), dan f(a) = f(b), maka ada bilangan c dalam selang terbuka (a, b) s...

 

Опис файлу Опис Довгівська сільська рада Джерело моє фото Час створення 02/04/17 Автор зображення Gudyma_s Ліцензія див. нижче Ліцензування Цей твір поширюється на умовах ліцензії Creative Commons Attribution 3.0 Unported. Коротко: ви можете вільно поширювати цей твір, змінювати і використ

 

أمين أحسن إصلاحي   معلومات شخصية الميلاد سنة 1904  أعظم كره  [لغات أخرى]‏  الوفاة 15 ديسمبر 1997 (92–93 سنة)  لاهور  الحياة العملية المدرسة الأم مدرسة الإصلاح  المهنة مترجم،  وعالم عقيدة،  وإمام،  ومفهرس كتب  [لغات أخرى]‏،  ولغوي،  ومدرس ...

Ця стаття є частиною Проєкту:Населені пункти України (рівень: невідомий) Портал «Україна»Мета проєкту — покращувати усі статті, присвячені населеним пунктам та адміністративно-територіальним одиницям України. Ви можете покращити цю статтю, відредагувавши її, а на стор...

 

رؤساء جامعة الأزهر منذ صدور القانون رقم 103 لسنة 1961 تولى رئاسة جامعة الأزهر منذ بداية الدراسة بها كجامعة مستقلة في عام 1381 هجري الموافق 1961 ميلادي العديد من الشخصيات البارزة وهي: رؤساء جامعة الأزهر أسامة العبد رئيس جامعة الأزهر الأسبق (ديسمبر 2017) الترتيب الشخص الفترة 1 محمد البه

 

English synth-pop band Not to be confused with The Humane League. The Human LeagueLineup: Susan Ann Sulley, Philip Oakey, Joanne CatherallBackground informationAlso known asThe Future (1977), the Men, the League, the League Unlimited Orchestra (1982)OriginSheffield, South Yorkshire, EnglandGenresSynth-popnew waveelectronicnew popDiscographyThe Human League discographyYears active1977–presentLabelsFast ProductWall of SoundVirginA&MEast WestPapillonSpinoffsHeaven 17Members Philip Oakey Jo...

Simón Bolívar United World College of AgricultureСільськогосподарський коледж об'єднаного світу Сімона БолівараТип приватна міжнародна школа-інтернатКраїна  Венесуела геокоординати не задано: Засновано 1986[1]Закрито 2012[2]Учні понад 1000 (за роки існування)Мова навчання іспанська Сіл

 

Bert RoachRoach dalam The Black Bag (1922)Lahir(1891-08-21)21 Agustus 1891Washington, D.C., Amerika SerikatMeninggal16 Februari 1971(1971-02-16) (umur 79)Los Angeles, California, Amerika SerikatPekerjaanPemeranTahun aktif1914-1951Suami/istriGladys Marie Johnson Egbert Bert Roach (21 Agustus 1891 – 16 Februari 1971) adalah seorang pemeran film Amerika Serikat. Ia tampil dalam 327 film antara 1914 dan 1951. Ia lahir di Washington, D.C., dan meninggal di Los Angeles, Ca...

 

Camino de Montserrat España España El Camino de Montserrat (22) forma parte de los Caminos Catalanes Monasterio de Montserrat Catedral de HuescaDatos del caminoNombre oficial Camino de Santiago de Montserrat a San Juan de la PeñaOtras denominaciones Camino Catalano-AragonésCamí de Sant Jaume nordCamino Catalán por HuescaIdentificador  ES22a Grupo Caminos CatalanesLongitud 316 kmInicio Monasterio de MontserratFinal Santa Cilia de JacaDistancia desde el inicio hasta Compost...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Januari 2023. A Writer's OdysseyNama lainHanzi Tradisional 刺殺小說家 Hanzi Sederhana 刺杀小说家 Arti harfiahAssassinate the NovelistHanyu Pinyincìshā xiǎoshuōjiā Sutradara Lu Yang Produser Ning Hao Ditulis oleh Lu Yang Chen Shu Haiyan ...

 

1964 single by The Dave Clark FiveBits and PiecesSingle by The Dave Clark Fivefrom the album Glad All Over B-sideAll of the TimeReleased14 February 1964 (UK)20 March 1964 (US)Recorded1963GenrePop rock, beatLength1:59LabelColumbia DB 7210Epic 5-9671Capitol 72148 (Canada)Songwriter(s)Credited: Dave Clark, Mike SmithClaimed: Ron RyanProducer(s)Adrian ClarkThe Dave Clark Five singles chronology Glad All Over (1964) Bits and Pieces (1964) Can't You See That She's Mine (1964) Bits and Pieces is a s...

 

English actress Charlotte RamplingOBERampling in 2015BornTessa Charlotte Rampling (1946-02-05) 5 February 1946 (age 77)Sturmer, Essex, EnglandOccupation(s)Actress, model, singerYears active1963–presentSpouses Bryan Southcombe ​ ​(m. 1972; div. 1976)​ Jean-Michel Jarre ​ ​(m. 1978; div. 2002)​ Partner(s)Jean-Noël Tassez (1998–2015; his death)Children2RelativesGodfrey Rampling (father)...

Dalit Community in India Achieving Universal Health Care has been a key goal of the Indian Government since the Constitution was drafted. The Government has since launched several programs and policies to realize ‘Health for All’ in the nation.[1][2] These measures are in line with the sustainable development goals set by the United Nations.[3][4] Health disparities generated through the Hindu caste system have been a major roadblock in realizing these goal...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Desember 2022. Pendidikan vokasi di Malaysia telah dikembangkan sejak tahun 1906 Masehi. Awalnya, pendidikan vokasi diselenggarakan di Malaysia guna menyediakan tenaga kerja terampil bagi Keretapi Tanah Melayu dan Jabatan Kerja Awam Malaysia. Bentuk lembaga pendidik...

 

Wakil Bupati Musi RawasPetahanaHj. Suwarti, S.IP.sejak 26 Februari 2021Masa jabatan5 tahunDibentuk2000Pejabat pertamaIr. H. Ibnu AminSitus webmusirawaskab.go.id/site/ Berikut ini adalah daftar Wakil Bupati Musi Rawas dari masa ke masa. No Wakil Bupati Mulai Jabatan Akhir Jabatan Prd. Ket. Bupati 1 Ir. H.Ibnu AminM.Sc. 2000 12 Maret 2004 1   H.Suprijono Joesoef Jabatan kosong 12 Maret 2004 12 Mei 2004   Ir. H.Ibnu AminM.Sc.(Pelaksana Tugas) 12 Mei 2004 2005   Ir. H.Ibnu Ami...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Johnny Yesno soundtrack – news · newspapers · books · scholar · JSTOR (March 2015) (Learn how and when to remove this template message) 1983 soundtrack album by Cabaret VoltaireJohnny Yesno: The Original Soundtrack from the Motion PictureSoundtrack alb...

 

MotoConiunctis ViribusDengan Kekuatan BersatuJenisNegeriDidirikan1785 (London Hospital Medical College), 1843 (Medical College of St Bartholomew's Hospital), 1882 (Westfield College), 1885 (Queen Mary College), 1989 (Queen Mary & Westfield), 1995 (sekolah kedokteran bergabung dengan QMW)Dana abadi£33 juta [1] Kepala sekolahProfesor Adrian SmithSarjana8.111Magister1.945LokasiLondon, Inggris, Britania RayaKampusPerkotaanAfiliasiUniversitas London, ACU, Group 1994Situs webwww.qmul.ac.uk Que...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!