スタックポインタ(Stack Pointer: SP)とは、CPU内部のレジスタの一つで、スタックと呼ばれるメモリ領域の現在の操作位置を示すものです。スタックは、プログラムの実行中に一時的にデータを保存するための領域で、後入れ先出し(LIFO: Last-In-First-Out)の原則でデータが管理されます。スタックポインタは、このスタック領域の操作位置を指し示し、データの追加(プッシュ)や削除(ポップ)の際に、その位置を更新します。
スタックとSPの役割
- スタックとは:スタックは、データ構造の一種で、データの追加(プッシュ)と削除(ポップ)が一本の棒の上下で行われるようなイメージです。新しいデータは常に一番上に追加され、取り出すときは一番上から取り出されます。この「後入れ先出し」の原則がスタックの特徴です。
- スタックポインタの役割:スタックポインタは、スタックのどこにデータを格納したり、どこからデータを取り出したりするかを指示する役割を担います。プログラムの実行中に、関数呼び出しや変数の一時保存など、様々な場面でスタックが利用され、その際にスタックポインタが参照されます。
- プッシュとポップ:
- プッシュ:スタックにデータを追加する操作です。低位アドレス側へ伸びる構成ではSPを減らす例がありますが、更新する向きやタイミングはCPU・方式によって異なります。
- ポップ:スタックからデータを取り出す操作です。最後に格納したデータを取り出し、対応する位置へSPを更新します。低位アドレス側へ伸びる構成の例ではSPが増えます。
- スタックポインタの重要性:スタックポインタは、プログラムの実行状態を管理するために非常に重要な役割を果たします。例えば、関数呼び出しの際に、必要に応じてローカル変数や戻りアドレスなどをスタックに保存し、関数終了時にスタックからそれらを復元することで、プログラムの実行を正しく継続できます。
- セキュリティとの関係:スタック上のバッファへの範囲外書込みなど、実装上の欠陥があると、保存情報の破壊や攻撃につながる場合があります。そのため、スタックの保護は、セキュリティ対策において重要な要素となっています。
簡単に言うと、スタックポインタは、スタック操作の基準となる位置を示す「目印」のようなものです。
備考
プログラムカウンター:命令位置を示す。基礎モデルでは次に取り出す命令のアドレスとして整理する
命令レジスタ:メモリから読み出された機械語命令を示す
ステータスレジスタ:割込みの許可状態及び条件分岐の判断に必要な演算結果の状態を示す
数値例:下降型・4バイト単位の場合
この例では、空の状態でSP=1000、プッシュ時にSPを4減らしてからその位置へ保存、ポップ時は現在位置から取り出してSPを4増やす、と定義します。
| 操作 | SP | 処理 |
|---|---|---|
| 開始 | 1000 | 空 |
| Aをプッシュ | 996 | 996にAを保存 |
| Bをプッシュ | 992 | 992にBを保存 |
| ポップ | 996 | 先にBを取り出す |
| ポップ | 1000 | 次にAを取り出す |
SPが「使用中の先頭」を示すか「次の空き」を示すか、増加・減少のどちらへ伸びるかは、問題の前提を優先します。取り出した後、メモリの値が即座にゼロへ消去されることまで意味しません。
SPとPCを混同しない
SPはスタックの操作位置、PCは命令位置に関係します。戻りアドレスを保存する仕組みは命令セットや呼出し規約によって異なり、リンクレジスタを使う構成などもあります。すべての関数呼出しで同じ保存方法になるとは限りません。
確認問題:プッシュすればSPは必ず小さくなる?
必ずとは言えません。スタックが伸びる向きと更新のタイミングは構成によります。下降型・先にSPを減らす、などの条件を確認して計算します。
noteでCPUの用語と計算を復習する
レジスタの役割を押さえたら、CPU・メモリ計算教材でクロック周波数・CPIなどを復習しましょう。リンク先は性能計算の教材で、SPの命令セット別の実装を網羅する教材ではありません。

コメント