Win32 関数呼び出し形式
(1999/09/18 [土])
以前に示した関数の呼び出し形式の中に Win32 形式の呼び出しというのがありました。これは Win32 になって使われるようになった呼び出し形式です。C 言語の中でこの呼び出し方を使うには、_stdcall 修飾子を関数につけます。では具体的にはどのように呼び出されるのか、一つの実装例を示します。
(1)で示される関数を、(2) のように呼び出すことを考えます。するとその具体的な呼び出し方法は (3) のようになります。Win32 形式の呼び出しでは、引数は、C 言語での呼び出し形式と同様に右から左に積まれます。この場合には、引数の 2、そして 1 です。そして関数名は何も変形されずそのままの名前となります。関数呼び出しではパラメータをスタックにプッシュしています。C 言語呼び出し形式である _cdecl のときは呼び出した側でパラメータを破棄していましたが、Win32 形式では PASCAL 形式と同様に呼び出された側から呼びだし元に戻ってくる時にすでにパラメータを捨てています。したがって、関数から返ってきた時には何もする必要はありません。パラメータを捨てる必要がない分だけ高速に実行できます。
//(1)関数のプロトタイプ void _stdcall foo(int x, int y); //(2)関数呼び出しの例 foo( 1, 2); //(3)具体的な 80386 アセンブリ言語に // よる呼び出しプログラム例 0000: push 2 0001: push 1 0002: call foo |
(1)で示される関数を、(2) のように呼び出すことを考えます。するとその具体的な呼び出し方法は (3) のようになります。Win32 形式の呼び出しでは、引数は、C 言語での呼び出し形式と同様に右から左に積まれます。この場合には、引数の 2、そして 1 です。そして関数名は何も変形されずそのままの名前となります。関数呼び出しではパラメータをスタックにプッシュしています。C 言語呼び出し形式である _cdecl のときは呼び出した側でパラメータを破棄していましたが、Win32 形式では PASCAL 形式と同様に呼び出された側から呼びだし元に戻ってくる時にすでにパラメータを捨てています。したがって、関数から返ってきた時には何もする必要はありません。パラメータを捨てる必要がない分だけ高速に実行できます。
by seclan