Kutsuva sopimus

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 11. elokuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 37 muokkausta .

Soittotapa ( eng.  calling convention ) - kuvaus aliohjelmien teknisistä ominaisuuksista, jossa määritellään:

Se on osa sovellusbinaariliitäntää ( ABI ) . 

Koostumus

Soittotapa kuvaa seuraavaa:

Kutsumistapa voidaan kuvata arkkitehtuurin ABI -dokumentaatiossa, käyttöjärjestelmän dokumentaatiossa tai kääntäjän dokumentaatiossa .

Käyttö

x86 :ssa 32-bittiseen osoitteeseen käytetyt kutsukäytännöt

Luettelo on epätäydellinen, tärkeimmät tähän päivään mennessä käytetyt sopimukset on esitetty.

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

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

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 .

stdcall tai winapi

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 .

pikapuhelu

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

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

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] .

Katso myös

  • libffi  on kirjasto funktioiden kutsumiseen erilaisilla käytännöillä.

Muistiinpanot

  1. 1 2 Pienet argumentit ovat arvoja, joiden koko on pienempi tai yhtä suuri kuin prosessorirekisterin koko . Esimerkiksi 1, 2 ja 4  tavua x86-prosessorille , joka toimii 32-bittisessä tilassa.
  2. 1 2 Suuret argumentit ovat arvoja, jotka ovat suurempia kuin prosessorirekisterin koko . Esimerkiksi 8 tai enemmän tavua x86-prosessorille , joka toimii 32-bittisessä tilassa.
  3. Prologi -  koodi , joka tallentaa rekistereitä , välittää argumentteja funktiolle ja sijoittaa paikallisia muuttujia funktiopinoon.
  4. Epilogue ( eng.  epilogue ) - koodi , joka palauttaa ohjauksen kutsuvaan funktioon, tyhjentää pinon, palauttaa rekisteriarvot , siirtää funktion palautusarvon.
  5. Ohjelmanhallinta: Rekisteröintisopimus . docwiki.embarcadero.com (1. kesäkuuta 2010). Käyttöpäivä: 27. syyskuuta 2010. Arkistoitu alkuperäisestä 20. marraskuuta 2012.
  6. _fastcall . msdn.microsoft.com. Käyttöpäivä: 27. syyskuuta 2010. Arkistoitu alkuperäisestä 20. marraskuuta 2012.
  7. Ohse, Uwe gcc-attribuuttien yleiskatsaus: function fastcall . ohse.de. Käyttöpäivä: 27. syyskuuta 2010. Arkistoitu alkuperäisestä 20. marraskuuta 2012.
  8. tämä puhelu (C++  ) . msdn.microsoft.com.

Linkit