「スタック」の版間の差分
提供: セキュリティ
(ページの作成:「スタック(stack) とは、C言語プログラムがプログラムの制御に必要な情報や関数のローカル変数を置くメモリ領域です。 '''...」) |
|||
行9: | 行9: | ||
[[スタック]]は、「後入れ、先出し」(LIFO, Last In First Out)という方式で利用されます。 | [[スタック]]は、「後入れ、先出し」(LIFO, Last In First Out)という方式で利用されます。 | ||
スタックにデータを追加する操作を「プッシュ」(push)、スタックからデータを取り出す操作を「ポップ」(pop)といいます。 | スタックにデータを追加する操作を「プッシュ」(push)、スタックからデータを取り出す操作を「ポップ」(pop)といいます。 | ||
+ | |||
+ | たとえば、C言語で関数を呼び出すときに、CPUの状態を保存します。レジスタの内容をスタックに保存します。呼び出した関数が終了し、呼び出し元のルーチンに戻ってきたときに、レジスタの状態をスタックから元に戻します。 | ||
+ | インテルのIA32のアセンブリ言語の命令だと PUSHA で、すべての汎用レジスタの内容をスタックにプッシュできます。POPAでスタックから汎用レジスタの内容を元に戻せます。 | ||
+ | |||
+ | 関数の引数のデータもスタックに入ります。関数の引数の値は、レジスタ渡しされることもあるので、必ずしもスタックにすべて入るというわけではありません。ケースバイケースです。コンパイラの実装や最適化などに依存します。 | ||
== スタックに積まれるもの == | == スタックに積まれるもの == | ||
スタックには、関数ごとに以下のデータが積まれます。 | スタックには、関数ごとに以下のデータが積まれます。 | ||
行19: | 行24: | ||
== 関連項目 == | == 関連項目 == | ||
{{c}} | {{c}} | ||
− | <!-- vim: filetype=mediawiki --> | + | <!-- vim: filetype=mediawiki |
+ | --> |
2015年11月7日 (土) 23:38時点における最新版
スタック(stack) とは、C言語プログラムがプログラムの制御に必要な情報や関数のローカル変数を置くメモリ領域です。
読み方
- スタック
- すたっく
- stack
- すたっく
概要
スタックは、「後入れ、先出し」(LIFO, Last In First Out)という方式で利用されます。 スタックにデータを追加する操作を「プッシュ」(push)、スタックからデータを取り出す操作を「ポップ」(pop)といいます。
たとえば、C言語で関数を呼び出すときに、CPUの状態を保存します。レジスタの内容をスタックに保存します。呼び出した関数が終了し、呼び出し元のルーチンに戻ってきたときに、レジスタの状態をスタックから元に戻します。 インテルのIA32のアセンブリ言語の命令だと PUSHA で、すべての汎用レジスタの内容をスタックにプッシュできます。POPAでスタックから汎用レジスタの内容を元に戻せます。
関数の引数のデータもスタックに入ります。関数の引数の値は、レジスタ渡しされることもあるので、必ずしもスタックにすべて入るというわけではありません。ケースバイケースです。コンパイラの実装や最適化などに依存します。
スタックに積まれるもの
スタックには、関数ごとに以下のデータが積まれます。
上記の集合(塊)をスタックフレームと呼びます。スタックには、スタックフレームがいくつも積まれていくイメージです。