【ぷろぐらむかうんた】

プログラムカウンタ とは?

最終更新:
💡 CPUが命令を実行する位置の目印

CPUが命令を実行する位置を示すレジスタ。命令の長さ、分岐・ジャンプによる変化を、RISC-Vの具体例で解説します。

📌 このページのポイント
プログラムカウンタ:命令の位置RISC-VのRV32I基本命令の例CPUのレジスタpc=0x1004命令の置かれた位置0x1000通常0x1004分岐0x1008後続…0x1010分岐先通常:0x1000 → 0x1004(+4)分岐成立:0x1008ではなく0x1010へこの仕様のpcは、現在の命令のアドレス
アドレスは説明用で、命令の個数ではありません。RV32Iの32ビット基本命令の例なので、圧縮命令や他CPUに4バイト刻みを一律に当てはめず、先読み・割り込みの保存先も省略しています。
ひよこ ひよこ
CPUは、どの命令を実行するかどう分かるの?
ペンギン先生 ペンギン先生
その位置を示すのがプログラムカウンタだよ。命令が置かれたアドレスを保持するレジスタなんだ。CPUの種類で詳しい扱いは異なるけれど、「プログラムのどこを実行するかの目印」と考えるとつかみやすい。
ひよこ ひよこ
いつも、次の命令の住所なの?
ペンギン先生 ペンギン先生
説明ではそう表すこともあるけれど、仕様で確認しよう。たとえばRISC-Vでは、pcは現在の命令のアドレスを保持すると定義されるよ。図もその定義で示していて、先読み等のCPU内部の処理を全部描いたものではないんだ。
ひよこ ひよこ
命令を一つ実行したら、1増える?
ペンギン先生 ペンギン先生
必ず1ではないよ。RISC-VのRV32Iの基本命令は32ビット、つまり4バイトなので、順に実行する例ではアドレスが4進む。別の命令セットや圧縮命令では長さが異なる。命令の個数と、バイト単位のアドレスを区別しよう。
ひよこ ひよこ
if文やループは、どう進むの?
ペンギン先生 ペンギン先生
CPUの分岐命令等で、条件に応じて実行する位置が変わるよ。図では0x1004の分岐が成立して0x1010へ進む例。条件が成立しなければ続く命令へ進む。ジャンプでは、指定した位置へ移るんだ。
ひよこ ひよこ
プログラムカウンタがあれば、処理の流れが分かる?
ペンギン先生 ペンギン先生
実行位置を追う手掛かりになるよ。デバッガーでは、その位置の命令や周囲の状態を合わせて調べる。PCだけでは変数の値やプログラム全体の意味は分からないので、ほかのレジスタやメモリ、ソースも一緒に確認するんだ。
もっと詳しく知りたい人へ

割り込みで、PCは必ずスタックに保存される?

保存先や復帰の仕組みはCPUの仕様によります。「どのCPUでも自動でスタックに積む」とは一般化できません。割り込み・例外による実行位置の変更と、後で戻るための状態の保存を区別して確認します。

図の4バイト刻みは、すべてのRISC-V命令に当てはまる?

この図は32ビットのRV32I基本命令の例です。RISC-Vには16ビットの圧縮命令もあり、対応する構成では命令の長さが混在します。図の進み方を、すべての命令・CPUに当てはめません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プログラムカウンタ」って出てきたら「CPUが命令を実行する位置を示す目印」と思えばだいたいOK!
📖 おまけ:英語の意味
「Program Counter(PC)」 = プログラムの実行位置を示すレジスタ
💬 ここでのPCはPersonal Computerではありません。命令のアドレスを指す仕組みで、何番目の命令かを単純に数えるものではありません。

参考資料

← 用語集にもどる