STDCALL 呼び出し規則には、以下の規則が適用されます。
- すべてのパラメーターは、スタック上で受け渡される。
- パラメーターは、字句の右から左の順番でスタック上にプッシュされる。
- 呼び出し先の 関数が、スタックからパラメーターを除去する。
- 浮動小数点値は、浮動小数点レジスター・スタックのトップ・レジスターである ST(0) に
戻される。集合値を戻す関数は、それらの値を以下のように戻します。
- 戻される集合値
- のサイズ
- 8 バイト
- EAX-EDX ペア
- 5、6、7 バイト
- EAX 戻り値を置くアドレスは、EAX において隠しパラメーターとして
受け渡されます。
- 4 バイト
- EAX
- 3 バイト
- EAX 戻り値を置くアドレスは、EAX に隠しパラメーターとして
受け渡されます。
- 2 バイト
- AX
- 1 バイト
- AL
サイズが 5、6、7、または 8 バイトより大きい集合を戻す関数の場合、戻り値を置くアドレスは、隠しパラメーターとして受け渡され、アドレスは EAX に戻されます。
- STDCALL には、引数の数が変わるプロトタイプ化されていない STDCALL 関数は動作しない、という制約事項があります。
- 関数名は、下線接頭部、およびパラメーターのバイト数 (10 進数) が後に付いた
アットマーク (@) で構成される接尾部によって装飾される。4 バイトより少ないパラメーターは、4 バイトに切り上げられます。構造体サイズも、複数の 4 バイトに切り上げられます。
例えば、次のようにプロトタイプ化された関数 fred を考えてみます。
dcl fred ext entry (fixed bin(31) byvalue, fixed bin(31) byvalue,
fixed bin(15) byvalue);
この関数は、オブジェクト・モジュールでは次のようになります。
_FRED@12
.DEF ファイルでエクスポート・リストを作成する場合は、装飾されたバージョンの名前を使用する必要があります。DEF ファイルにおいて装飾されていない名前を
使用する場合は、ILIB に対し、DEF ファイルと一緒にオブジェクト・ファイルを提供する必要があります。
ILIB は、オブジェクト・ファイルを使用して、それぞれの名前が装飾後にどのようになるかを
判別します。
|
This information center is powered by Eclipse technology. (http://www.eclipse.org)