情報処理試験を勉強していると、「プログラムカウンタって何?命令レジスタとどう違うの?」と混乱しがちです。この記事では、プログラムカウンタの定義から命令実行での動き、試験での出題パターンまでを一気に整理します。
対象試験と出題頻度
プログラムカウンタは、基本情報技術者・応用情報技術者で出題されるテーマです。
CPU内部のレジスタに関する問題として定番化しており、「命令レジスタ」「汎用レジスタ」「アキュムレータ」との違いを正確に区別できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★☆☆
ランクB(標準)覚えておくと有利
用語の定義
プログラムカウンタ(Program Counter / PC)とは、一言で言うと
「次に実行する命令が格納されている主記憶上のアドレスを保持するレジスタ」
のことです。
イメージとしては、「読書中に挟んでおく “しおり”」です。
本を途中まで読んだら、「次はここから読む」という位置にしおりを挟みます。
1ページ読み終わるたびにしおりは次のページへ自動的にずれていきます。プログラムカウンタもまったく同じで、CPUが「次に取り出すべき命令の場所」を常に記録し、命令を1つ取り出すたびにその値を自動で更新します。
📊 プログラムカウンタの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Program Counter(PC) |
| 別名 | プログラムレジスタ、命令アドレスレジスタ、インストラクションポインタ(IP) |
| 所属する装置 | CPUの制御装置内 |
| 保持する内容 | 次に実行する命令の主記憶上のアドレス |
解説
コンピュータはプログラムの命令を主記憶(メインメモリ)に格納し、それを1つずつ取り出して実行します。この「命令の取り出し → 解読 → 実行」を繰り返す一連の流れを命令実行サイクルと呼びます。
このサイクルの起点となるのがプログラムカウンタです。
CPUはまずプログラムカウンタが指すアドレスをもとに主記憶から命令を取り出し(フェッチ)、その直後にプログラムカウンタの値を命令長の分だけ自動加算して、次の命令を指すように更新します。
命令実行サイクルにおける動き
以下の図で、命令実行サイクルの各ステップとプログラムカウンタの値の変化を確認してください。
命令実行サイクルとプログラムカウンタ(PC)の動き
PCのアドレスから
命令取出+PC加算
命令レジスタの
命令を解読
オペランドから
実効アドレス算出
実効アドレスから
データ取得
演算実行+
結果格納
※ 分岐命令の場合、⑤でジャンプ先アドレスがPCに上書きされ、①で別のアドレスからフェッチする
分岐命令時の特殊な動き
通常、プログラムカウンタは「+1」で順番にアドレスを進めます。
しかし分岐命令(ジャンプ命令)が実行されると、ジャンプ先のアドレスがプログラムカウンタに直接セットされます。これにより、CPUはプログラムの途中から別の場所へ処理を飛ばすことができます。
if文やループの制御は、この仕組みで実現されています。
通常実行 vs 分岐命令
▼ 通常実行
▼ 分岐命令
他のレジスタとの比較
CPU内部には複数のレジスタがあり、それぞれ役割が異なります。
以下の表で「何を保持するか」を整理しておくと、試験の選択肢を瞬時に判別できます。
| レジスタ名 | 保持する内容 | 所属装置 |
|---|---|---|
| プログラムカウンタ | 次に実行する命令のアドレス | 制御装置 |
| 命令レジスタ | 主記憶から取り出した命令そのもの(デコード対象) | 制御装置 |
| 汎用レジスタ | 演算に使うデータやアドレスを一時的に保持 | 演算装置 |
| アキュムレータ | 演算結果の状態(条件分岐の判定に使用) | 演算装置 |
| ベースレジスタ | プログラムの先頭アドレス(基底アドレス指定に使用) | 制御装置 |
| インデックスレジスタ | 配列アクセス等に使う修飾値(指標アドレス指定に使用) | 制御装置 |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 プログラムカウンタの核心を3行で
・CPU制御装置内のレジスタで、次に実行する命令の主記憶アドレスを保持する
・命令フェッチ後に自動で+1(命令長分)され、順次実行を実現する
・分岐命令ではジャンプ先アドレスが直接セットされ、処理の飛び先を切り替える
試験ではこう出る!
プログラムカウンタは、FE・APの午前問題で「レジスタの役割を選ばせる問題」として繰り返し出題されています。同一の問題文がFEとAPで流用されるケースも多く、パターンを1つ押さえれば複数回の試験に対応できます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H23秋 午前 問10 |
プログラムレジスタ(プログラムカウンタ)の役割を4択から選ぶ | ・正解は「次の命令が格納されたアドレスを保持する」 ・汎用レジスタ、アキュムレータ、命令レジスタの説明がひっかけ |
| AP H29春 午前 問8 |
上記FE H23秋 問10と同一問題(流用) | ・FEとAPで同じ問題が出回る典型例 ・選択肢の文言もほぼ同一 |
| AP R1秋 午前 問9 |
上記と同一構成の問題(再出題) | ・3回目の出題でも問題文・選択肢が変わっていない ・パターン暗記で確実に得点できる |
| IP H24春 問61 |
CPUにおけるプログラムカウンターの説明を選ぶ | ・正解は「次に実行する命令が入っている主記憶のアドレスを保持する」 ・「命令数を保持する」「メモリ領域の大きさを保持する」が誤答 |
📝 IPA試験での出題パターン
パターン1:「プログラムカウンタの役割を選べ」
4つのレジスタの説明文が並び、プログラムカウンタに該当するものを選ぶ形式。ひっかけとして「メモリから読み出したデータを保持する」(汎用レジスタ)、「演算結果の状態を保持する」(アキュムレータ)、「メモリから読み出した命令を保持する」(命令レジスタ)の説明が紛れ込む。キーワードは「次の命令」「アドレス」。
パターン2:「アドレス指定方式との絡み」
相対アドレス指定方式の問題で「命令のアドレス部の値とプログラムカウンタの値を加算する」という記述が登場する。直接の出題ではないが、プログラムカウンタの意味を理解していないと解けない。
試験ではここまででOKです。命令実行サイクルの細かいステップ順や、割込み発生時のPC退避の仕組みまで深追いする必要はありません。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. CPUのプログラムカウンタ(プログラムレジスタ)の役割として、最も適切なものはどれでしょうか?
- A. 命令を読み出すために、次の命令が格納された主記憶上のアドレスを保持する。
- B. 命令のデコードを行うために、メモリから読み出した命令そのものを保持する。
- C. 演算を行うために、メモリから読み出したデータを一時的に保持する。
正解と解説を見る
正解:A
解説:
プログラムカウンタは、次に実行すべき命令が格納されている主記憶上のアドレスを保持するレジスタです。CPUはこの値を参照して命令をフェッチします。
選択肢Bは命令レジスタの説明です。命令レジスタは主記憶から取り出した命令そのものを格納し、デコーダで解読するために使われます。選択肢Cは汎用レジスタの説明です。汎用レジスタは演算対象のデータやアドレスを一時的に保持するもので、「次の命令の場所」とは無関係です。
よくある質問(FAQ)
Q. 「プログラムカウンタ」と「プログラムレジスタ」は同じものですか?
同じものです。IPA試験の問題文では「プログラムレジスタ(プログラムカウンタ)」のように両方の名称を併記する形式が定着しています。また、Intel系のCPUでは「インストラクションポインタ(IP)」と呼ぶこともあります。名前が違うだけで機能は同一なので、どの名前で出題されても同じレジスタだと判断してください。
Q. プログラムカウンタの値は常に+1されるのですか?
通常の順次実行では命令長の分だけ加算されます(固定長命令のCPUでは+1、可変長命令のCPUでは命令のバイト数分)。ただし分岐命令(JMP、CALL等)が実行された場合はジャンプ先のアドレスが直接セットされ、サブルーチン呼び出し(CALL)の場合は戻り先アドレスをスタックに退避してからジャンプします。割込み発生時も同様に、現在の値がスタックに退避されたうえで割込みハンドラのアドレスがセットされます。
Q. 相対アドレス指定方式ではプログラムカウンタをどう使いますか?
相対アドレス指定方式は、命令のアドレス部の値(オペランド)にプログラムカウンタの現在値を加算して実効アドレスを求める方式です。プログラムが主記憶上のどこにロードされても正しくアドレスを参照できるため、再配置可能(リロケータブル)なプログラムの実現に利用されます。基本情報技術者のアドレス指定方式の問題で登場する頻出論点です。
Q. パイプライン処理でプログラムカウンタはどう影響しますか?
パイプライン処理では複数の命令が同時に異なるステージで処理されるため、プログラムカウンタは先行して次々と加算されます。ここで分岐命令が発生すると、先読みしていた命令が無駄になる「分岐ハザード」が起こります。これを軽減する技術として分岐予測(Branch Prediction)があり、分岐先を予測してあらかじめプログラムカウンタの値を設定します。試験範囲では深掘りされませんが、パイプラインの問題を解く際の背景知識として知っておくと有利です。