呼び出し規約におけるスタックの注意事項 (Windows* のみ)

C の呼び出し規約では、呼び出されたルーチンから制御が返ってきた直後に必ず呼び出し側のルーチンがスタックを調整します。この結果、プロシージャーが呼び出されるたびに、スタックを復元するためのコードが必要となるため、オブジェクト・コードのサイズが多少大きくなります。STDCALL 呼び出し規約では、呼び出されたプロシージャーがスタックを制御します。スタックを復元するコードは、呼び出されたプロシージャーに含まれるため、このコードは一度しか使用されません。

しかし、C の呼び出し規約では、可変長引数による呼び出しが可能です。C の呼び出し規約では、呼び出し側がスタックをクリーンアップするので、可変長引数でルーチンを記述することができます。したがって、実際に渡された引数の数にかかわらず、フレームポインターを基準としたアドレスは変わりません。このため、呼び出し側のルーチンがスタックを制御する場合、渡された引数の数、それらのサイズ、およびスタックに含まれている位置がわかるので、引数をスキップしても、追跡を続行することができます。

可変長引数でルーチンを呼び出すには、ルーチンへのインターフェイスに ATTRIBUTES C および VARYING オプションを追加します。VARYING オプションは、Fortran がルーチン内の引数の数を強制的に一致させないようにします。VARYING オプションは、オプションの引数を持つ Fortran 90 組み込みルーチンでは不要です。このようなルーチンでは、引数の順序やキーワードで、引数の有無を決定します。

MASM では、プロシージャーのスタック制御に C または STDCALL の規則を採用していますが、MASM コードを記述して、プロシージャー内のスタックを任意に制御することができます。また、PROC 宣言子の USES オプションを指定すれば、特定のレジスターの保存および復元を自動的に行うことができます。


このヘルプトピックについてのフィードバックを送信

© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。