Notice : 内容無保証。禁無断転載。リンク自由。

2.2 ちょっと詳しく..

引数が2つ以上あるときは、 どんな順番でスタックにつまれるのでしょう?

次のソースをコンパイルしたとき、 どのようなコードが生成されるか見てみましょう。

int foo(int, int, int) ;

int main(void) {
    int x ;

    x = foo(1, 2, 3) ;

    return 0 ;
}

foo() の呼び出しは、次のようになりました。

b8 03 00            mov     ax,3
50                  push    ax
b8 02 00            mov     ax,2
50                  push    ax
b8 01 00            mov     ax,1
50                  push    ax
9a 00 00 00 00      call    FAR PTR _foo
83 c4 06            add     sp,6

このコードからわかるように、 最後の引数からスタックにつまれます。

では、順を追ってスタックの変化を見ていきましょう。

(1) 引数をスタックにつむ前

(2) foo() に制御が渡った時点でのスタックの状態

(3) foo() からのリターン直後

このままでは、 スタックポインタの位置が foo()の呼びだし前後で変わってしまいます。 そこで、最後に add sp,6 をやって

(4) スタックポインタを元に戻す

foo() 側が、スタックをどう解釈するかについては、 プロトタイプ宣言の章で説明します。 お楽しみに!


[ <前 ][ 目次 ][ 次> ]
トップページに戻る