|
プログラミングにおける呼出規約(よびだしきやく)ないし呼出慣例(よびだしかんれい)はサブルーチンを呼び出す際の標準的な手法を指す。サブルーチンにデータを渡し、戻るべきアドレス(リターンアドレス)を記録し、サブルーチンからデータを受け取るための規則である。一つのプログラムでは、(複数の言語処理系を用いて記述する場合も)同一の呼出規約を守る必要がある。 さまざまな呼出規約があり、引数のコールスタック(以下単にスタックと呼ぶ)への格納法、サブルーチンにデータを渡す方法、サブルーチンからの復帰法、名前修飾が異なる。 == cdecl == インテルx86ベースのシステム上のC、C++では cdecl 呼出規約が使われることが多い。cdeclでは関数への引数は右から左の順でスタックに積まれる。関数の戻り値は EAX(x86のレジスタの一つ)に格納される。呼び出された側の関数ではEAX, ECX, EDXのレジスタの元の値を保存することなく使用してよい。呼び出し側の関数では必要ならば呼び出す前にそれらのレジスタをスタック上などに保存する。スタックポインタの処理は呼び出し側で行う。 例えば、以下のCプログラムの関数呼び出しは、
以下のような機械語を生成する(MASMにおけるx86アセンブリ言語で記述する)
a, b, cの順でCソースコードに記述された引数は、逆の順序c, b, aでスタックに積まれ、call命令でリターンアドレスをスタックに積んだ上でサブルーチンにジャンプする。戻った後に呼び出し側がスタック上の引数データを除去する。 cdecl は通常 x86 Cコンパイラのデフォルトであるが、他のコンパイラも(Delphiを含むPascalコンパイラ等)、cdecl に呼出規約を変更するオプションを持っている。手動で操作するには、例えば、
とする。_cdeclはプロトタイプ宣言部ないし関数宣言部に書く必要がある。 OS/2上の Virtual Pascal での例を挙げると、
のようにCDECL指令を付ける。このコンパイラは通常下記の Pascal 呼出規約を用いるが、この関数はOS/2のウィンドウシステム (Presentation Manager) から呼ばれるため、システム側に合わせてcdecl呼出規約に変更する必要がある。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「呼出規約」の詳細全文を読む 英語版ウィキペディアに対照対訳語「 Calling convention 」があります。 スポンサード リンク
|