呼出規約
(Cdecl から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/24 14:20 UTC 版)
呼出規約(よびだしきやく)ないし呼出慣例(よびだしかんれい)(英: calling convention)は、コンピュータの命令セットアーキテクチャごとに取り決められるABIの一部で、サブルーチンが呼出される際に従わねばならない制限などの標準である。名前修飾について、データを渡す「実引数」、戻るべきアドレスである「リターンアドレス」、データを戻す「返戻値」などを、スタックなどに対してどのように格納するのか、また各レジスタを、呼び出し側とサブルーチンのどちらの側が保存するか、等といった取決めの集まりである。言語が同じでも、分割コンパイルされリンカでリンクされる相互のプロシージャ間では、呼出し呼出されるならば同一の呼出規約に従っていなければならない。一方で、違う言語の間でも、同一の呼出規約を経由して相互にプロシージャを呼出すこともできる。
- ^ ボーランド __fastcall 呼出規約では、残りの引数は Pascal 呼出規約 と同様に左から右の順にスタックに積まれる。“変数修飾子 - RAD Studio XE2”. Delphi® XE2 および C++Builder® XE2 オンライン ヘルプ. Embarcadero Technologies, Inc. (2012年4月30日). 2013年1月22日閲覧。
cdecl
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/12/25 15:34 UTC 版)
インテル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 cpush bpush acall functionadd 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呼出規約に変更する必要がある。
※この「cdecl」の解説は、「呼出規約」の解説の一部です。
「cdecl」を含む「呼出規約」の記事については、「呼出規約」の概要を参照ください。
- Cdeclのページへのリンク