スタックポインター
読み:スタックポインター
外語:stack pointer
スタックの現在位置を示すレジスター。
概要
プロセッサーにより、レジスターが専用に用意されているものと、用意されていないものがある。専用レジスターがない場合は汎用レジスターで代用することになる。
例えば、Windowsパソコンで使われているx86は専用レジスターがあるが、スマートフォンで使われている32ビットのARMは専用レジスターがなかった(64ビットARMでは専用レジスターが追加された)。
特徴
動作
動作はプロセッサーごとに異なるので一般論になるが、通常、スタックポインターは最後にpushした値の先頭アドレスを指している。ただし実装によっては、次にpushされる先頭アドレスを指していることもある。
また、スタックの延びていく方向、つまりスタックに積む(pushする)場合に、アドレスが減るか増えるかも実装ごとに様々ある。
実装方法
ARMの用語を借りると、スタック制御は次の4種類がある。ストア(push)とロード(pop)で、おのおの選択される。
- IB Increment Before ‐ 最初にSPを増分
- IA Increment After ‐ 後でSPを増分
- DB Decrement Before ‐ 最初にSPを減分
- DA Decrement After ‐ 後でSPを減分
ストアとロードが4種類を選択するので、理論上は4×4で16通りとなる。しかし実際には、ストアしたものは後でロードする前提なので、SPの動きは相互に補完的でなければならない。
結果として、現実には次の4種類の組み合わせのどれかが使われている(こちらもARMの用語)。
- FD Full Descending (ロードIA、ストアDB)
- ED Empty Descending (ロードIB、ストアDA)
- FA Full Ascending (ロードDA、ストアIB)
- EA Empty Ascending (ロードDB、ストアIA)
一般的な挙動
x86の場合、ARMの用語を借りればFD(Full Descending)に対応する。次の動作をする。
- スタックにストアする(pushする)場合は、最初にSPを減分してから、そこに値を書き込む。
- スタックからロードする(popする)場合は、値を読みこんでから、後でSPを増分する。
ARMの場合は4種類から自由に選択できるが、実際にはx86と同様に、FD(Full Descending)で使われることが多いようである。
再検索