呼出規約

呼出規約(よびだしきやく)ないし呼出慣例(よびだしかんれい)(: calling convention)は、コンピュータ命令セットアーキテクチャごとに取り決められるABIの一部で、サブルーチンが呼出される際に従わねばならない制限などの標準である。名前修飾について、データを渡す「実引数」、戻るべきアドレスである「リターンアドレス」、データを戻す「返戻値」などを、スタックなどに対してどのように格納するのか、また各レジスタを、呼び出し側とサブルーチンのどちらの側が保存するか、等といった取決めの集まりである。言語が同じでも、分割コンパイルされリンカでリンクされる相互のプロシージャ間では、呼出し呼出されるならば同一の呼出規約に従っていなければならない。一方で、違う言語の間でも、同一の呼出規約を経由して相互にプロシージャを呼出すこともできる。

cdecl

インテルx86ベースのシステム上のC/C++では cdecl 呼出規約が使われることが多い。cdeclでは関数への引数は右から左の順でスタックに積まれる。関数の戻り値は EAX(x86のレジスタの一つ)に格納される。呼び出された側の関数ではEAX, ECX, EDXのレジスタの元の値を保存することなく使用してよい。呼び出し側の関数では必要ならば呼び出す前にそれらのレジスタをスタック上などに保存する。スタックポインタの処理は呼び出し側で行う。

例えば、以下のCプログラムの関数呼び出しは、

int function(int, int, int);
int a, b, c, x;
...
x = function(a, b, c);

以下のような機械語を生成する(MASMにおけるx86アセンブリ言語で記述する)。

push c
push b
push a
call function
add esp, 12 ;スタック上の引数を除去
mov x, eax

Cソースコードにてa, b, cの順で記述された引数は、逆の順序c, b, aでスタックに積まれ、call命令でリターンアドレスをスタックに積んだ上でサブルーチンにジャンプする。戻った後に呼び出し側がスタック上の引数データを除去する。

cdecl は通常 x86 Cコンパイラのデフォルトであるが、他のコンパイラも(Delphiを含むPascalコンパイラ等)、cdecl に呼出規約を変更するオプションを持っている。手動で操作するには、例えば、

void _cdecl function(params);

とする。_cdeclはプロトタイプ宣言部ないし関数宣言部に書く必要がある。

OS/2上の Virtual Pascal での例を挙げると、

function MyWndProc(h : HWND; m : ULONG; mp1 : MPARAM; mp2 : MPARAM) : MRESULT; CDECL;

のようにCDECL指令を付ける。このコンパイラは通常下記の Pascal 呼出規約を用いるが、この関数はOS/2のウィンドウシステム (Presentation Manager) から呼ばれるため、システム側に合わせてcdecl呼出規約に変更する必要がある。

Pascal

Pascal 呼出規約はcdeclの逆である。引数は左から右への順序でスタックに積まれ、スタック上の引数データを除去するのは呼ばれた側(サブルーチン側)である。Cと異なり、引数の個数と型がサブルーチン宣言時点で完全に固定であるため、スタック上の引数データのバイト数はサブルーチン内部で判明している。引数データの除去は実際にはサブルーチンからのリターン時のスタックポインタの調整で行われ、x86では"RET n"の一命令で実行可能である。サブルーチンのコードサイズはわずかながら増えることが多いが、呼び出し側でスタックを処理するコードが不要になるため全体としてはわずかながらコードのサイズが小さくなることが多い。本来呼出規約はプログラミング言語とは独立した概念だが、プログラミング言語の影響を受ける例である。

Lisa及び初期のMacintoshのシステム、アプリケーションはPascalで記述されたため、以前のMacintosh Toolboxを利用するにはPascal呼出規約を用いる必要があった。

呼出規約と言語仕様

言語仕様と呼出規約は独立した概念だが、上記の例とは逆に、呼出規約が実装レベルで言語仕様に影響を与える場合がある。fooとbarがどちらも関数であるとし、foobar(foo, bar) のように複数の引数をとる関数呼び出しがあるとする。Pascal 呼出規約では引数を左から右に格納するので、fooを先に、barを後に評価するのが自然で効率が高い。cdeclでは逆にbarを先にfooを後に評価すると自然である。これらの呼出規約に沿って「自然に」コンパイラを実装すると、言語仕様を実装レベルで決定してしまうことになる。

例えば次のPascalコードを考える。

var i : Integer;
...
function foo : Boolean;
begin
    foo := i > 0;
    i := 1
end;

function bar : Boolean;
begin
    bar := i > 0;
    i := -1
end;

function foobar(f, b : Boolean) : Boolean;
begin
    foobar := f < b
end;

begin
   i := 1;
   write(foobar(foo, bar))
end

関数呼び出し foobar(foo, bar) を行う際引数のfooとbarのどちらを先に評価するかで、結果が変わる。fooを先に評価すると変数 i はfoo呼び出し後にも1であるので、fooは真、barも真、foobar(foo, bar)は偽となる。barを先に評価すると、barは真だが、呼び出し後に i は-1になるため、fooは偽となり、foobar(foo, bar)は真となる。なお、標準Pascalでは引数を評価する順序を規定しておらず、結果が引数の評価順に依存するプログラムは良くない例だとされる。この例は良くない例である。

Register (fastcall)

レジスタ呼出規約または fastcall、レジスタ渡し が意味するものは、歴史的な事情からコンパイラ依存であるが、総じて次のようなものである。プロセッサのレジスタのビット幅と個数に合わせて、最初のいくつかの引数を(スタックではなく)レジスタに格納し、サブルーチンに渡す。残りの引数は cdecl と同様に右から左の順にスタックに積まれる[1]。戻り値はAL, AX, EAXレジスタに格納する。関数の引数の個数が可変でない場合は、スタックからの引数データの除去は(Pascal 呼出規約のように)サブルーチン側で行うのが通例である。しかしながら、ほとんどのランタイムライブラリサブルーチンはわずかな個数の引数しか取らないため、スタックにデータを積む必要は(従ってスタックを清掃する必要も)全くない。メモリよりレジスタの方が読み書きが速いため、レジスタ渡しは効率が高い。

レジスタ渡しの例

  • マイクロソフト(以下MS) __fastcall[1][2] 呼出規約(別名 __msfastcall)では、最初の2つの引数をECXおよびEDXに格納する。
  • ボーランド __fastcall[3] 呼出規約では、最初の3つの引数をEAX, EDX, ECXに格納する。
  • Watcom __fastcall 呼出規約では、最初の4つの引数をEAX, EDX, EBX, ECXに格納する。

Watcom C/C++ コンパイラでは #pragma aux[4] コンパイラ指令を用いて、プログラマが自前の呼出規約を指定することができる。取扱説明書によると、「"Very few users are likely to need this method, but if it is needed, it can be a lifesaver"(引用部分につき訳さない。ほとんど不要だが、いざという時には必要なものである、程度の意)」だそうである。

stdcall

MS stdcall [5]Windows APIで利用されている。引数は右から左に渡される。呼び出された側の関数ではEAX, ECX, EDXのレジスタの元の値を保存することなく使用してよい。呼び出し側の関数では必要ならば呼び出す前にそれらのレジスタをスタック上などに保存する。返り値はEAXに格納する。cdeclと異なり、スタックの清掃はサブルーチン側で行う(Pascal 呼出規約と同様)。ただし引数リストが可変長の場合は呼び出し側がスタックの後始末を行う。


safecall

WindowsでのDelphiは、safecallという呼出規約を用いてCOMのエラー処理をカプセル化している。COM/OLE の要求に沿って、例外が呼び出し側に漏れ出すことがなく、戻り値HRESULTに報告される。Delphiのコードからsafecallを行うと、自動的にHRESULTがチェックされ、必要なら例外が発生する。

thiscall

この規約はC++のメンバ関数を呼ぶのに用いられる。二つの主たる版があり、コンパイラ及び、関数が可変長の引数リストを用いるかによっていずれかが用いられる。

GCC (GNUコンパイラコレクション)では、thiscall はほとんど cdecl と同様である。呼び出し側がスタックを清掃し、引数は右から左の順で渡される。相違点は全ての引数を渡した後、最後に this ポインタがスタックに積まれることである。これは Windows で可変引数を用いるときの thiscall と類似している。

Windowsの場合は、関数が可変引数を取らない場合、引数は右から左に渡され、thisポインタはECXレジスタに格納される。スタックを清掃するのは呼ばれた側である。

thiscallがキーワードではないため、thiscallを明示的に指定することはできないが、IDAのような逆アセンブラではそれを指定する必要がある。そのため、__thiscall__というキーワードが用意されている。

clrcall

未稿

vectorcall

浮動小数点型、__m128型、およびそれらのうち同一の型を最大4つメンバーに持つ複合型はXMM0:XMM5に、__m256型およびその複合型はYMM0:YMM5を用いる。収まらなかった分は整数型としてポインタ渡しされる。返り値はEAX、EDX:EAX、XMM0:XMM3、YMM0:YMM3のいずれかに格納される。 それ以外はマイクロソフト fastcallに準ずる。

Intel ABI

インテルアプリケーションバイナリインタフェース (ABI) はほとんどのコンパイラが採用している呼出規約である。呼び出された側の関数ではEAX, ECX, EDXのレジスタの元の値を保存することなく使用してよい。呼び出し側の関数では必要ならば呼び出す前にそれらのレジスタをスタック上などに保存する。

x86-64

マイクロソフト x64呼出規約

x64呼出規約はx86-64(AMD64) / EM64Tで追加されたレジスタ空間を有益に利用する。RCX, RDX, R8, R9レジスタは整数型とポインタ型の引数に、XMM0, XMM1, XMM2, XMM3は浮動小数点型引数に用いられる。残りの引数はスタックに置かれる。__m128型はXMMレジスタを使わずスタックに置かれ整数型としてポインタ渡しされる。呼び出された側の関数ではRAX, RCX, RDX, R8, R9, R10, R11, XMM0:XMM5のレジスタの元の値を保存することなく使用してよい。呼び出し側の関数では必要ならば呼ぶ出す前にそれらのレジスタをスタック上などに保存する。レジスタが足りなくなれば、スタックが用いられる。返り値はRAXかXMM0に格納される。スタックポインタの処理は呼び出し側で行う。

vectorcall

浮動小数点型、__m128型、およびそれらのうち同一の型を最大4つメンバーに持つ複合型はXMM0:XMM5に、__m256型およびその複合型はYMM0:YMM5を用いる。収まらなかった分は整数型としてポインタ渡しされる。返り値はRAX、XMM0:XMM3、YMM0:YMM3のいずれかに格納される。 それ以外はマイクロソフト x64呼出規約に準ずる。

System V AMD64 ABI 呼出規約

LinuxBSDmacOSなどマイクロソフトのオペレーティングシステム (OS) 以外で利用されている。

  • 整数・ポインタ引数 - RDI, RSI, RDX, RCX, R8, R9
  • 浮動小数点引数 - XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7
  • 戻り値 - RAX
  • システムコールでは RCX の代わりに R10 を使用
  • レジスタだけでは引数の数が不足する場合はスタックを利用。

標準サブルーチンプロローグ/エピローグ

サブルーチンに制御が渡った点で、標準的には次のような処理を行う:

_function:
    push ebp       ;ベースポインタを保存
    mov ebp, esp   ;現在のスタックフレームを指すようベースポインタを変更
    sub esp, x     ;局所変数(Cでいう自動変数)の大きさの分スタックポインタを減らす

この結果、EBPはスタック上の引数の頭を指し、局所変数を格納する領域をスタック上に確保することができる。元のEBPの値はスタックに保存されている。このように局所変数は引数と同様にサブルーチン呼び出し毎にスタック上に確保されるので、再帰呼び出しが可能になる。

このサブルーチンから抜け出す際は、次のシーケンスを実行する:

    mov esp, ebp   ;局所変数を除去
    pop ebp        ;ベースポインタを復帰
    ret            ;サブルーチンから戻る

これはcdeclの例であって、Pascal 呼出規約では次のように引数データをサブルーチン側が掃除する。

    ret n          ;nは引数データのバイト数

次のC関数は

int _cdecl MyFunction(int i) { 
    int k;
    return i + k;
}

次のアセンブラコードと同等である。

    ;エントリシーケンス
    push ebp
    mov ebp, esp
    sub esp, 4     ;整数型変数kの領域に相当

    ;関数のコード
    mov eax, [ebp + 8] 
                   ;引数iを加算器(アキュムレータ)に移動
    add eax, [ebp - 4]
                   ;kをiに加える
                   ;結果はEAX(加算器)に残る

    ;終了シーケンス
    mov esp, ebp
    pop ebp
    ret

脚注・出典

  1. ^ ボーランド __fastcall 呼出規約では、残りの引数は Pascal 呼出規約 と同様にからの順にスタックに積まれる。変数修飾子 - RAD Studio XE2”. Delphi® XE2 および C++Builder® XE2 オンライン ヘルプ. Embarcadero Technologies, Inc. (2012年4月30日). 2013年1月22日閲覧。

関連項目

外部リンク

Read other articles:

Pemimpin Skuadron Waddy di Morotai pada sekitar tahun 1945 John Lloyd Waddy, OBE, DFC (10 Desember 1916 – 11 September 1987) adalah seorang perwira dan penerbang senior dalam Royal Australian Air Force (RAAF), dan kemudian menjabat sebagai anggota Majelis Legislatif New South Wales dan Menteri Mahkota. Sebagai pilot penyerang pada Perang Dunia II, ia menembak lima belas pesawat musuh dalam Perang Gurun, menjadikannya penerbang ulung pencetak skor tertinggi di Australia...

 

CaremaKomuneComune di CaremaNegara ItaliaWilayahPiedmontProvinsiProvinsi Torino (TO)Luas • Total10,5 km2 (41 sq mi)Populasi (Desember 2004) • Total754 • Kepadatan7,2/km2 (19/sq mi)Zona waktuUTC+1 (CET) • Musim panas (DST)UTC+2 (CEST)Kode pos10010Kode area telepon0125 Carema adalah komune yang terletak di distrik Provinsi Torino, Italia. Kota Carema memiliki luas sebesar 10.5 km². Carema pada tahun 2004, memili...

 

Ular lidi Liopeltis tricolor Status konservasiRisiko rendahIUCN183199 TaksonomiKerajaanAnimaliaFilumChordataKelasReptiliaOrdoSquamataFamiliColubridaeGenusLiopeltisSpesiesLiopeltis tricolor Schlegel, 1837 lbs Ular lidi (Liopeltis tricolor) adalah jenis ular kecil yang terdapat di Asia Tenggara.[1] Pengenalan Panjang tubuh ular lidi mencapai 75 cm. Tubuh bagian atas berwarna zaitun kecoklatan. Pada setiap sisi kepala terdapat garis hitam yang membentang melalui mata. Bagian bawah tubuhn...

National Historic Site of the United States United States historic placeTao HouseU.S. National Register of Historic PlacesU.S. National Historic LandmarkU.S. National Historic Site Tao House in summerShow map of San Francisco Bay AreaShow map of CaliforniaShow map of the United StatesLocationKuss Road, Danville, CaliforniaCoordinates37°49′28″N 122°1′47″W / 37.82444°N 122.02972°W / 37.82444; -122.02972Area158.6 acres (64.2 ha)Built1937ArchitectFrederick...

 

Application in medieval astrology Astrology Background Worship of heavenly bodies History of astrology Astrology and astronomy Planets Behenian Classical Traditions, types, and systems Astrology and science Astrologers Astrological organizations Traditions Babylonian Chinese Hellenistic Hindu Islamic Jewish Tibetan Western Branches Natal Electional Horary Medical Financial Locational Psychological Meteorological Astrological signs Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius...

 

Myitkyina မြစ်ကြီးနားမြို့Negara BurmaDivisiNegara bagian KachinDistrikDistrik MyitkyinaKotaprajaKotapraja MyitkyinaPopulasi (2014) • Total306.949 • EtnisitasKachinShanBamarTionghoaGorkha • AgamaBuddhaKristenZona waktuUTC+6.30 (WSM)Kode area telepon74IklimCwa[1] Myitkyina (Burma: မြစ်ကြီးနားမြို့code: my is deprecated ; MLCTS: mrac kri: na: mrui., diucapkan [mjɪʔtɕín�...

Tour du Loir-et-Cher 2017 GénéralitésCourse58e Tour du Loir-et-CherCompétitionUCI Europe Tour 2017 2.2Étapes5Dates12 – 16 avril 2017Distance789,5 kmPays FranceLieu de départBloisLieu d'arrivéeBloisPartants166Arrivants116Vitesse moyenne42,698 km/hSite officielSite officielRésultatsVainqueur Alexander Kamp (VéloCONCEPT)Deuxième Troels Vinther (Riwal Platform)Troisième Rasmus Guldhammer (VéloCONCEPT)Classement par points Alexander Kamp (VéloCONCEPT)Meilleur grimpeur Rick Ottema (B...

 

Dante Maggio Dante Maggio (Napoli, 2 marzo 1909 – Roma, 3 marzo 1992) è stato un attore italiano. Esponente di una storica famiglia di artisti napoletani, di tutti i componenti, insieme alla ben più nota sorella Pupella, è stato quello con all'attivo la maggiore attività professionale. Indice 1 Biografia 2 Filmografia 3 Altri progetti 4 Collegamenti esterni Biografia Sin da ragazzo calca le tavole del palcoscenico, diventando uno dei nomi di punta della scena napoletana: è - insieme al...

 

Nick Blackman Informasi pribadiNama lengkap Nicholas Alexander BlackmanTanggal lahir 11 November 1989 (umur 34)Tempat lahir Bury, EnglandTinggi 6 ft 2 in (1,88 m)Posisi bermain PenyerangInformasi klubKlub saat ini ReadingNomor 30Karier junior2005–2006 Macclesfield TownKarier senior*Tahun Tim Tampil (Gol)2006–2009 Macclesfield Town 12 (1)2009– Blackburn Rovers 1 (0)2009 → Blackpool (pinjaman) 5 (1)2009–2010 → Oldham Athletic (pinjaman) 12 (1)2010 → Motherwell...

213th Rifle DivisionActive1941–1946CountrySoviet UnionBranchRed ArmyTypeInfantryRoleMotorized InfantrySizeDivisionEngagementsWorld War IIBattle honoursNovoukrainkaCommandersNotablecommandersIvan BuslayevMilitary unit The 213th Rifle Division (Russian: 213-я стрелковая дивизия) was formed as an infantry division of the Red Army during World War II after a motorized division of that same number was destroyed about seven weeks following the start of the German invasion o...

 

Сельское поселение России (МО 2-го уровня)Новотитаровское сельское поселение Флаг[d] Герб 45°14′09″ с. ш. 38°58′16″ в. д.HGЯO Страна  Россия Субъект РФ Краснодарский край Район Динской Включает 4 населённых пункта Адм. центр Новотитаровская Глава сельского пос�...

 

Pour les articles homonymes, voir Union pour un mouvement populaire (homonymie), UMP, Union populaire et Union pour la majorité présidentielle. Union pour un mouvement populaire Logotype officiel. Présentation Fondation 23 avril 2002(Union pour la majorité présidentielle)17 novembre 2002(Union pour un mouvement populaire) Fusion de RPRDLMDRUDF (dissidents) Scission dans DLR (2008) Siège 238, rue de Vaugirard75015 Paris Cedex 15 Changement de nom 30 mai 2015 (devenue Les Républicains) ...

Political party in Thailand People's Power Party พรรคพลังประชาชนAbbreviationPPPLeaderSamak Sundaravej (2007-2008) Somchai Wongsawat (2008)Secretary-GeneralSurapong SubwongleeFounderGarn TienkaewFoundedNovember 9, 1998DissolvedDecember 2, 2008Preceded byThai Rak Thai Party (de facto)Succeeded byPheu Thai Party (de facto)IdeologyRoyalismPopulismConservative liberalismPolitical positionCentreColorsRed, Blue, WhiteWebsitehttp://www.ppp.or.th/Politi...

 

Southern Palestine Offensive of the Sinai and Palestine Campaign in the First World War Battle of Mughar RidgePart of the Middle Eastern theatre of World War I3/3rd Gurkha Rifles holding front line trenchesDate13 November 1917LocationJunction Station, PalestineResult British Empire victoryBelligerents  British Empire  Australia  United Kingdom  New Zealand  India  Ottoman Empire German EmpireCommanders and leaders Edmund Allenby Henry Chauvel Edward Bulfin P...

 

Multi-party war in the former Russian Empire (1917–1923) For other uses, see Russian Civil War (disambiguation). Russian Civil WarPart of the Russian Revolution, the aftermath of World War I, and the interwar periodClockwise from top left: Soldiers of the Don Army Soldiers of the Siberian Army Bolshevik suppression of the Kronstadt rebellion American troops in Vladivostok during the Allied intervention Victims of the Red Terror in Crimea Hanging of Bolsheviks in Yekaterinoslav by the Austri...

Philosophical and theological term For the belief in being able to contact the dead, see Spiritualism (beliefs). Part of a series onSpirituality Outline Religion History Timeline Traditional Elite religion Jewish Merkabah Kabbalah Hasidism Christian Catholic Mysticism Sufism Folk religion Modern Buddhist modernism New religious movement Secular spirituality Spiritual but not religious Syncretism Spiritual experience Lived religion Mystical experience Oceanic feeling Religious experience Relig...

 

Mount LincolnMount Lincoln viewed from Little Haystack Mountain on the Franconia Ridge.Highest pointElevation5,089 ft (1,551 m)[1]Prominence169 ft (52 m)[2]Parent peakMount LafayetteListingWhite Mountain 4000-FootersCoordinates44°08′56″N 71°38′40″W / 44.1489451°N 71.6445258°W / 44.1489451; -71.6445258[1]GeographyMount LincolnShow map of New HampshireMount LincolnShow map of the United States LocationWhite Mou...

 

Group of Hindu mother goddesses MatrikaGoddesses of War, Children and Emancipation.[1]The Seven Mother Goddesses (Matrikas) flanked by Shiva (left) and Ganesha (right)DevanagariमातृकाSanskrit transliterationmātṝkāAffiliationShakti, Devi, Mahadevi Part of a series onShaktism History Deities Mahadevi (Supreme) Devi Shakti Parvati Durga Mahavidya Kali Lalita Matrikas Lakshmi Saraswati Scriptures and texts Vedas Tantras Yogini Shakta Upanishads Devi Sita Tripura Devi Bhaga...

Abel Khaled Foto diambil selama pertandingan antara Stade Rennes dan USM Alger dalam pertandingan persahabatan di stadion Paul-Audrin di Dinard pada 16 Juli 2016.Informasi pribadiNama lengkap Abel KhaledTanggal lahir 9 November 1992 (umur 31)Tempat lahir TunisiaTinggi 1,79 m (5 ft 10+1⁄2 in)Posisi bermain PenyerangInformasi klubKlub saat ini Stade Brestois 29Nomor 13Karier senior*Tahun Tim Tampil (Gol)2011 SAS Épinal 2012– Stade Brestois 29 6 (0) * Penampilan dan...

 

Shopping mall in Pennsylvania, United StatesGrove City Premium OutletsFood court of the mall in 2014LocationGrove City, Pennsylvania, United StatesCoordinates41°8′22″N 80°9′26″W / 41.13944°N 80.15722°W / 41.13944; -80.15722DeveloperPrime OutletsManagementSimon Property Group's Premium Outlet DivisionOwnerSimon Property Group's Premium Outlet DivisionNo. of stores and services140No. of floors1 (open-air)Websitewww.premiumoutlets.com/outlet/grove-city Grove C...