PASCAL 言語の関数呼び出し形式
(1999/08/01 [日])
以前に示した関数の呼び出し形式の中に PASCAL 言語形式の呼び出しというのがありました。これはまさに名前が示しているように、DOS の時代から PASCAL 言語で使われてきた呼び出し方です。C 言語の中でこの呼び出し方を使うには、_pascal 修飾子を関数につけます。
では具体的にはどのように呼び出されるのでしょうか。ただしここで挙げるのは C 言語の規格ではなく、一つの実装例であることに気をつけてください。
(1)で示される関数を、(2) のように呼び出すことを考えます。するとその具体的な呼び出し方法は (3) のようになります。PASCAL 形式の呼び出しでは、引数は左から右に積まれます。この場合には、引数の 1、そして 2 です。このような方式の採用により、通常の方法では可変長引数は使えません。また関数名は、foo から FOO というようにすべて大文字の名前に変形されます。関数呼び出しではパラメータをスタックにプッシュしています。_cdecl のときは呼び出した側でパラメータを破棄していましたが、PASCAL 形式では呼び出された側から呼びだし元に戻ってくる時にすでにパラメータを捨てています。したがって、関数から返ってきた時には何もする必要はありません。_cdecl の呼び出しに比べるとパラメータを捨てる必要がない分だけ高速に実行できます。
#あっという間に 8 月に突入。それにしても暑い。少しでも涼しくするため、今月から "まんぼう" です。涼しげでしょう。
//(1)関数のプロトタイプ void _pascal foo(int x, int y); //(2)関数呼び出しの例 foo( 1, 2); //(3)具体的な 80386 アセンブリ言語に // よる呼び出しプログラム例 0000: push 1 0001: push 2 0002: call FOO |
(1)で示される関数を、(2) のように呼び出すことを考えます。するとその具体的な呼び出し方法は (3) のようになります。PASCAL 形式の呼び出しでは、引数は左から右に積まれます。この場合には、引数の 1、そして 2 です。このような方式の採用により、通常の方法では可変長引数は使えません。また関数名は、foo から FOO というようにすべて大文字の名前に変形されます。関数呼び出しではパラメータをスタックにプッシュしています。_cdecl のときは呼び出した側でパラメータを破棄していましたが、PASCAL 形式では呼び出された側から呼びだし元に戻ってくる時にすでにパラメータを捨てています。したがって、関数から返ってきた時には何もする必要はありません。_cdecl の呼び出しに比べるとパラメータを捨てる必要がない分だけ高速に実行できます。
#あっという間に 8 月に突入。それにしても暑い。少しでも涼しくするため、今月から "まんぼう" です。涼しげでしょう。
by seclan