Everything
9.1.4 スタック・フレーム

(1)

スタック・ポインタに設定する値

スタック・ポインタ(SP)には2の倍数のアドレスが設定されます。

(2)

スタック・フレームの割り当てと解放

スタック・ポインタは常にスタック・フレームの最下位アドレスを指します。したがって,SPのアドレスよりも小さい領域に格納された値は保証されません。

関数の呼び出し時に呼び出し元関数で割り当てられたスタック領域は,関数の呼び出しからリターンした時に呼び出し元関数で解放されます。したがって,SPは呼び出された関数の入口と出口でリターン・アドレス格納領域を指します。

(3)

スタック・フレームの構成

関数 f(Callee側関数)が,関数g(Caller側関数)から呼び出された場合の,関数fから見た双方のスタック・フレームの内容を以下に示します。

図 9.1

スタック・フレームの内容

 

関数fが参照,または設定できる領域の内容は以下です。

(a)

関数fが受け取る仮引数を割り付ける領域

レジスタに割り付けない仮引数を設定する領域です。この領域に設定されたデータは2バイト境界にアラインされます。すべての仮引数をレジスタに割り付けるとこの領域のサイズが0となります。

(b)

リターン・アドレス格納領域

リターン・アドレスを割り付ける領域です。領域のサイズは4バイト固定で,アドレスはfarアドレスとして設定されます。

4バイトのうちの上位1バイトの値は不定です。

(c)

関数fのローカル変数格納領域

関数fがローカル変数を格納するために使用するスタック領域です。

(d)

関数fから呼び出す関数に引き渡す実引数を割り付ける領域

関数fがほかの関数を呼び出す際に,スタックに割り付ける実引数を設定する領域です。呼び出しに要する実引数を全てレジスタに割り付けるなら,この領域のサイズは0となります。