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) .
Kaldstævnet beskriver følgende:
Opkaldskonventionen kan beskrives i arkitektur ABI- dokumentationen, i OS- dokumentationen eller i compilerdokumentationen .
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(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 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 .
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 .
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 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 ;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] .