「スタックフレーム」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「スタックフレーム (stack frame)とは、C言語のプログラムが関数を呼び出すときにスタックにデータを積みますが、そのデ...」)
 
(相違点なし)

2014年2月17日 (月) 15:23時点における最新版

スタックフレーム (stack frame)とは、C言語のプログラムが関数を呼び出すときにスタックにデータを積みますが、そのデータをまとめた呼び方です。

読み方

スタックフレーム
すたっくふれーむ
stack frame
すたっくふれーむ

概要

スタックには、プログラムの制御に必要な情報やプログラムのワークエリア(ローカル変数)として利用されます。

関数呼び出しをするときに、関数の引数のデータをスタックに置いて、関数に渡します。

呼び出された関数の制御が終わったときに、呼び出し元に制御を移すためには、ベースポインタの値を元に戻したり、呼び出し側の命令に戻るための情報(リターンアドレス)が必要になります。

関数は、ローカル変数のデータをスタック領域において使用します。

スタックフレーム

C言語のプログラムを例に挙げます。

void foo() { ; }
void bar() { foo(); }
int main() { bar(); }

上記のコードが foo() の処理に移ったときに、スタックには、以下のようにスタックフレームが積まれていきます。

スタックフレーム
スタックフレーム
fooのスタックフレーム
barのスタックフレーム
mainのスタックフレーム

スタックフレームの中身

スタックには、関数の引数やローカル変数、リターンアドレスベースポインタ(bp)が積まれます。関数ごとのデータのまとまりをスタックフレームと呼びます。 以下の表に例を示します。

スタックとリターンアドレス
スタックフレーム スタック
barのスタックフレーム barのローカル領域
ベースポインタ
リターンアドレス
barの引数領域
mainのスタックフレーム mainのローカル領域
ベースポインタ
リターンアドレス
mainの引数領域
_startのスタックフレーム _start ...

関連項目