ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
最後に格納したものが真っ先に取り出される形式(LIFO)によるデータの格納方法のこと。英語で積み重ねること。
CISCタイプのマイクロプロセッサーでは、レジスターの内容の保管に用いたり、他のプログラムを呼び出す際に現在実行中のアドレスを保管しておいたりする際に利用している。
RISCでは、高速化のためにスタックの機能を持っていないものもある。
スタックはメインメモリーの一部を利用し、その位置はCPUのレジスターであるスタックポインターによって示されるのが一般的である。従って、スタックの大きさは有限であり、格納できるデータの総量は決まっている。
しかしプログラムのバグなどで規定の大きさを超える量のデータをスタックに積んでしまった場合、別のメモリー領域を破壊してしまうことになる。これをスタックオーバーフロー(スタックあふれ)と呼ぶ。
一般的な実装では、スタックに使うメモリー領域をまず決め、その領域の底となる最上位アドレスをスタックポインターに登録する。
そして、データをスタックに積む場合は、積む大きさ分スタックポインターを減算する。
スタックからデータを取り出す場合は、取り出した大きさ分スタックポインターを加算する。
ARMを例にすると、次の4つのモードがある。
Full/Emptyは先に加減するか後で加減するかを表わし、Descending/AscendingはSPを減算するか加算するかを表わす。
SPの位置には既に値が埋まっている(フル)と考え、先にSPを変更し、SPの位置に値を置く。
下降モードは、利用する度にSPを減算する。つまりスタックは下方に成長する。
PUSH処理後のSPは、最後に置かれた値を指している。
POP処理後のSPは、次の使用(フル)ロケーションである。
SPの位置にはまだ値が格納されていない(空)と考え、SPの位置に値を置き、SPは後で変更する。
下降モードは、利用する度にSPを減算する。つまりスタックは下方に成長する。
PUSH/POP処理後のSPは、次に置かれる場所を指している。
SPの位置には既に値が埋まっている(フル)と考え、先にSPを変更し、SPの位置に値を置く。
上昇モードは、利用する度にSPを加算する。つまりスタックは上方に成長する。
PUSH処理後のSPは、最後に置かれた値を指している。
POP処理後のSPは、次の使用(フル)ロケーションである。
SPの位置にはまだ値が格納されていない(空)と考え、SPの位置に値を置き、SPは後で変更する。
上昇モードは、利用する度にSPを加算する。つまりスタックは上方に成長する。
PUSH/POP処理後のSPは、次に置かれる場所を指している。
殆どのCPUの実装は、このうちFull Descending(フル下降)である。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます