Soittotapa ( eng. calling convention ) - kuvaus aliohjelmien teknisistä ominaisuuksista, jossa määritellään:
Se on osa sovellusbinaariliitäntää ( ABI ) .
Soittotapa kuvaa seuraavaa:
Kutsumistapa voidaan kuvata arkkitehtuurin ABI -dokumentaatiossa, käyttöjärjestelmän dokumentaatiossa tai kääntäjän dokumentaatiossa .
Alla luetelluissa sopimuksissa (paitsi ) aliohjelman on palautettava segmenttirekisterien arvot , rekisterit ja cdeclennen arvojen palauttamista funktiosta . Muiden rekisterien arvoja ei saa palauttaa. espebp
Jos funktion palautusarvo on pienempi tai yhtä suuri kuin rekisterin koko eax , palautusarvo tallennetaan rekisteriin eax . Muussa tapauksessa palautusarvo tallennetaan pinon yläosaan ja pinon yläosaan osoittava osoitin tallennetaan rekisteriin eax . Jos palautetaan objekti, jossa on automaattinen tuhoaja (mikä tahansa C++-objekti, jossa on ei-null- destructor , mielivaltaisen pituiset merkkijonot Pascalissa, BSTR:t WinAPI:ssa jne .), kutsujan on tuhottava se sulavasti.
cdecl(lyhenne englanninkielisestä c - deklaraatiosta ) on kutsukonventio, jota kääntäjät käyttävät C - kielelle (siis nimi).
Funktioargumentit välitetään pinon läpi oikealta vasemmalle. Alle 4 tavua pienemmät argumentit laajennetaan 4 tavuksi. Kutsuva ohjelma tyhjentää pinon . Tämä on tärkein tapa kutsua toimintoja , joissa on vaihteleva määrä argumentteja (esimerkiksi printf()). Menetelmät funktion palautusarvon saamiseksi on esitetty taulukossa.
Tyyppi | Palautusarvon koko, tavua | Paluuarvon välitysmenetelmä | Merkintä |
---|---|---|---|
Kokonaisluku, osoitin | 1, 2, 4 | Rekisterin kautta eax | Arvot, jotka ovat pienemmät kuin 4 tavua, laajennetaan 4 tavuksi |
Kokonaisluku | kahdeksan | Parin rekisterin kautta edx:eax | |
liukulukuluku | 4, 8 | Rekisterin kautta (alkaen x87st0 pseudostack , FPU ) | |
Muut | Yli 8 | Rekisterin kautta eax | Osoitin tietorakenteeseen on tallennettu rekisteriin eax |
Ennen funktion kutsumista lisätään koodi , jota kutsutaan prologiksi ( englanniksi prolog ), ja se suorittaa seuraavat toiminnot:
Kun toiminto on kutsuttu, koodi lisätään , jota kutsutaan epilogiksi ( englanniksi epilogiksi ), ja se suorittaa seuraavat toiminnot:
pascal on Pascal - kielen kääntäjien käyttämä kutsukäytäntö . Käytetään myös Windows 3.x :ssä.
Proseduurien ja funktioiden argumentit kulkevat pinon läpi vasemmalta oikealle. Kutsuttu aliohjelma palauttaa osoittimen pinon alkuun ( rekisterin esp arvo ) alkuasentoon . Muokattavat parametrit välitetään vain viittauksella . Palautusarvo välitetään muuttuvan Result-parametrin kautta. Result-parametri luodaan implisiittisesti ja on ensimmäinen argumentti .
stdcalltai se on Windowsin käyttämä kutsutapa winapi kutsuessaan WinAPI - funktioita .
Funktioargumentit välitetään pinon läpi oikealta vasemmalle. Kutsuttu aliohjelma tyhjentää pinon .
fastcall - yleisnimi konventoille, jotka välittävät parametreja rekistereiden kautta (yleensä tämä on nopein tapa tietokoneelle suorittaa suoritus, tästä johtuu nimi (tässä etuliite " fast " englanniksi käännetään " nopeaksi " ja " call " englanniksi " soita "). Eli kirjaimellisesti käännettynä " pikapuhelu ")). Jos rekistereitä ei ole tarpeeksi kaikkien parametrien ja välitulosten tallentamiseen, käytetään lisäksi pinoa.
Kutsukäytäntöä fastcallei ole standardoitu, joten sitä käytetään vain sellaisten toimintojen ja toimintojen kutsumiseen, joita ei viedä suoritettavasta moduulista eikä tuoda ulkopuolelta.
Borland - kääntäjissä tavanomaisen tavan mukaan , jota kutsutaan myös [5] , parametrit siirretään rekistereissä vasemmalta oikealle ja ja jos parametreja on enemmän kuin kolme, pinossa myös vasemmalta oikealle . Kutsuttu aliohjelma palauttaa pinon alkuun johtavan osoittimen alkuarvon ( rekisteriarvon ) . __fastcallregister eaxedxecx esp
Microsoftin [6] -kääntäjän 32 - bittisessä versiossa sekä GCC-kääntäjässä [ 7] käytäntö , jota kutsutaan myös nimellä , määrittää, että kaksi ensimmäistä parametria välitetään vasemmalta oikealle rekistereissä ja ja loput. parametrit siirretään pinossa oikealta vasemmalle . Kutsuttu aliohjelma tyhjentää pinon . __fastcall__msfastcall ecxedx
safecall on kutsukäytäntö, jota käytetään kutsumaan COM -liitäntöjen menetelmiä .
COM - liitäntämenetelmät ovat funktioita , jotka palauttavat HRESULT - tyypin . Funktion kutsun jälkeen lisätty koodi jäsentää palautusarvon. Jos tapahtuu virhe, koodi kirjaa lokiin virhekoodin, virheilmoituksen ja aiheuttaa poikkeuksen . Muussa tapauksessa todellinen palautusarvo piilotetaan ja sen sijaan käytetään viimeistä funktiolle viittauksella välitettyä parametria. Esimerkiksi seuraavia kahta funktion määritystä voidaan pitää vastaavina.
// safecall- toiminto DoSomething ( a : DWORD ) : DWORD ; safecall ; // safecall simulointitoiminto DoSomething ( a : DWORD ; out Tulos : DWORD ) : HResult ; stdcall ;thiscall on kutsukäytäntö, jota kääntäjät käyttävät C ++ -kielelle kutsuessaan luokkamenetelmiä olioohjelmoinnissa .
Funktioargumentit välitetään pinon läpi oikealta vasemmalle. Kutsuttu funktio tyhjentää pinon . Käytäntö thiscalleroaa stdcallkäytännöstä vain siinä, että osoitin objektiin, jossa metodia kutsutaan ( pointer this ), kirjoitetaan rekisteriin ecx[8] .