「スタック」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「スタック(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でスタックから汎用レジスタの内容を元に戻せます。

関数の引数のデータもスタックに入ります。関数の引数の値は、レジスタ渡しされることもあるので、必ずしもスタックにすべて入るというわけではありません。ケースバイケースです。コンパイラの実装や最適化などに依存します。

スタックに積まれるもの

スタックには、関数ごとに以下のデータが積まれます。

上記の集合(塊)をスタックフレームと呼びます。スタックには、スタックフレームがいくつも積まれていくイメージです。

関連項目