Kalder konvention

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 11. august 2018; checks kræver 37 redigeringer .

Opkaldskonvention ( eng.  calling convention ) - en beskrivelse af de tekniske funktioner ved opkaldsunderrutiner , der definerer:

Det er en del af applikationens binære grænseflade ( ABI) . 

Sammensætning

Kaldstævnet beskriver følgende:

Opkaldskonventionen kan beskrives i arkitektur ABI- dokumentationen, i OS- dokumentationen eller i compilerdokumentationen .

Brug

Opkaldskonventioner brugt på x86 til 32-bit adressering

Listen er ufuldstændig, de vigtigste aftaler, der er brugt til i dag, er præsenteret.

For de konventioner, der er anført nedenfor (undtagen ), skal subrutinen gendanne værdierne af segmentregistrene , registrene og cdeclfør returnering af værdier fra funktionen . Værdierne i andre registre kan muligvis ikke gendannes. espebp

Hvis funktionens returværdi er mindre end eller lig med størrelsen af ​​et register eax , gemmes returværdien i et register eax . Ellers gemmes returværdien i toppen af ​​stakken, og markøren til toppen af ​​stakken gemmes i registeret eax . Hvis et objekt med en autodestructor returneres (ethvert C++-objekt med en ikke-null- destructor , strenge med vilkårlig længde i Pascal, BSTR'er i WinAPI osv.), skal den, der ringer, graciøst ødelægge det.

cdecl

cdecl(forkortelse for engelsk  c - declaration ) er en kaldekonvention, der bruges af compilere til C -sproget (deraf navnet).

Funktionsargumenter sendes gennem stakken, fra højre mod venstre. Argumenter mindre end 4 bytes udvides til 4 bytes. Stakken tømmes af det kaldende program . Dette er den vigtigste måde at kalde funktioner med et variabelt antal argumenter (f.eks. printf()). Metoder til at opnå returværdien af ​​en funktion er angivet i tabellen.

Type Returværdistørrelse, bytes Returværdibeståelsesmetode Bemærk
Heltal, pointer 1, 2, 4 Gennem register eax Værdier, der er mindre end 4 bytes, udvides til 4 bytes
Heltal otte Gennem et par registre edx:eax
flydende kommanummer 4, 8 Via register (fra x87st0 pseudostack , FPU )
Andet Mere end 8 Gennem register eax En pointer til en datastruktur er lagret i et register eax

Før funktionen kaldes, indsættes en kode kaldet en prolog ( engelsk  prolog ) og udfører følgende handlinger:

Efter at funktionen er kaldt, indsættes kode kaldet en epilog ( engelsk  epilog ) og udfører følgende handlinger:

pascal

pascal er en kaldekonvention, der bruges af compilere til Pascal -sproget . Bruges også i Windows 3.x.

Argumenter til procedurer og funktioner føres gennem stakken, fra venstre mod højre. Markøren til toppen af ​​stakken (værdien af ​​registret esp ) til startpositionen returneres af den kaldte subrutine . Modificerbare parametre videregives kun ved reference . Returværdien sendes gennem parameteren Resultat, der kan ændres. Resultatparameteren er implicit oprettet og er det første argument til .

stdcall eller winapi

stdcalleller erwinapi  kaldekonventionen, der bruges af Windows til at kalde WinAPI - funktioner .

Funktionsargumenter sendes gennem stakken, fra højre mod venstre. Stakken ryddes af den kaldede subrutine .

hurtigt opkald

fastcall - det generelle navn for konventioner, der sender parametre gennem registre (normalt er dette den hurtigste måde for en computer at udføre, deraf navnet (her oversættes præfikset " hurtig " på engelsk som " hurtig ", og " kald " på engelsk oversættes som " opkald "). Det vil sige bogstaveligt oversat som " hurtigt opkald ")). Hvis der ikke er nok registre til at gemme alle parametre og mellemresultater, bruges stakken yderligere.

Opkaldskonventionen er ikke standardiseret fastcall, så den bruges kun til at kalde procedurer og funktioner, der ikke eksporteres fra det eksekverbare modul og ikke importeres udefra.

I Borland compilers , for konventionen , også kaldet [5] , sendes parametre fra venstre mod højre i registre , og , hvis der er mere end tre parametre, på stakken, også fra venstre mod højre . Startværdien af ​​markøren til toppen af ​​stakken ( registerværdi ) returneres af den kaldte subrutine . __fastcallregister eaxedxecx esp

I 32-bit versionen af ​​Microsoft [6] compileren såvel som i GCC compileren [ 7] specificerer konventionen , også kaldet , at de første to parametre sendes fra venstre mod højre i registre og , og de resterende parametre sendes fra højre mod venstre på stakken. Stakken ryddes af den kaldede subrutine . __fastcall__msfastcall ecxedx

safecall

safecall er en kaldekonvention, der bruges til at kalde metoder til COM -grænseflader .

COM -grænseflademetoder er funktioner , der returnerer en HRESULT -type . Koden tilføjet efter kaldet til funktionen analyserer returværdien. Hvis der er en fejl, logger koden fejlkoden, fejlmeddelelsen og rejser en undtagelse . Ellers skjules den faktiske returværdi, og den sidste parameter, der er sendt til funktionen ved reference , bruges i stedet . For eksempel kan følgende to funktionserklæringer betragtes som ækvivalente.

// safecall funktion DoSomething ( a : DWORD ) : DWORD ; safecall ; // safecall- simuleringsfunktion DoSomething ( a : DWORD ; ud Resultat : DWORD ) : HResult ; stdcall ;

dette opkald

thiscall er en kaldekonvention, der bruges af compilere til C++-sproget, når de kalder klassemetoder i objektorienteret programmering .

Funktionsargumenter sendes gennem stakken, fra højre mod venstre. Stakken ryddes af den kaldte funktion. Konventionen thiscalladskiller sig stdcallkun fra konventionen ved, at pointeren til det objekt, som metoden påkaldes på ( pointer this ), skrives ind i registeret ecx[8] .

Se også

  • libffi  er et bibliotek til at kalde funktioner ved hjælp af forskellige konventioner.

Noter

  1. 1 2 Små argumenter er værdier, hvis størrelse er mindre end eller lig med størrelsen af ​​et processorregister . For eksempel 1, 2 og 4  bytes for en x86-processor, der kører i 32-bit-tilstand.
  2. 1 2 Store argumenter er værdier, der er større end størrelsen af ​​et processorregister . For eksempel 8 eller flere bytes for en x86-processor, der kører i 32-bit-tilstand.
  3. Prolog -  kode , der gemmer registre , sender argumenter til en funktion og placerer lokale variabler på funktionsstakken.
  4. Epilogue ( eng.  epilogue ) - kode , der returnerer kontrol til den kaldende funktion, rydder stakken, gendanner registerværdier , overfører funktionens returværdi.
  5. Programkontrol: Registerkonvention . docwiki.embarcadero.com (1. juni 2010). Dato for adgang: 27. september 2010. Arkiveret fra originalen 20. november 2012.
  6. _fastcall . msdn.microsoft.com. Dato for adgang: 27. september 2010. Arkiveret fra originalen 20. november 2012.
  7. Ohse, Uwe gcc-attributoversigt: funktion fastcall . ohse.de. Dato for adgang: 27. september 2010. Arkiveret fra originalen 20. november 2012.
  8. dette opkald (C++  ) . msdn.microsoft.com.

Links