呼び出し規約におけるスタックの注意事項

C 呼び出し規約では,必ず呼び出し側のルーチンが,呼び出されたルーチンから制御が返ってきた直後にスタックを調整します。このため,手続が呼び出されるすべての場所にスタックを復元するためのコードが存在しなければならず,オブジェクト・コードがいくぶん大きくなります。STDCALL 呼び出し規約では,呼び出された手続がスタックを制御します。スタックを復元するコードは呼び出された手続中に置かれるので,このコードは 1 回しか現れません。

しかし,C 呼び出し規約では,可変個の引数による呼び出しが可能になります。C 呼び出し規約では,呼び出し側がスタックをクリーンアップするので,可変個の数の引数を取るルーチンを書くことが可能になります。実際に何個の引数が渡されるにしても,フレーム・ポインタを基準としたアドレスは変わりません。このため,呼び出し側のルーチンがスタックを制御する場合,何個の引数を渡したのか,その大きさがどれだけなのか,そしてスタックのどの位置にあるのかがわかっているので,引数の数が変わっても追跡を続けることができます。

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

MASM においても,スタック制御は手続に対して C または STDCALL の規約を宣言することによって設定されますが,手続内のスタックを好きなように制御する MASM コードを作成することができます。また,PROC 命令の USES オプションを指定すれば,特定のレジスタの保存と復元を自動的に行わせることができます。