基本情報技術者 2011年 秋期 午前(科目A) 問10
問題文
CPUのプログラムレジスタ(プログラムカウンタ)の役割はどれか。
選択肢
ア:演算を行うために、メモリから読み出したデータを保持する。
イ:条件付き分岐命令を実行するために、演算結果の状態を保持する。
ウ:命令のデコードを行うために、メモリから読み出した命令を保持する。
エ:命令を読み出すために、次の命令が格納されたアドレスを保持する。(正解)
##: CPUのプログラムレジスタ(プログラムカウンタ)の役割はどれか。【午前2 解説】
要点まとめ
- 結論:プログラムカウンタ(PC)は「次に実行すべき命令が格納されたメモリのアドレス」を保持する専用レジスタであると覚えてください。
- 根拠:命令フェッチ段でCPUはPCの示すアドレスから命令を読み出し、その後PCを更新することで命令列の逐次実行や分岐制御を行います。
- 差がつくポイント:PCは命令そのものや演算結果やフラグを保持しない点、命令を保持するのは命令レジスタ(IR)やデータレジスタの役割である点を区別しましょう。
正解の理由
選択肢の中で唯一、プログラムカウンタの定義に合致するのがエです。プログラムカウンタは命令フェッチのために「次に実行する命令が格納されたアドレス」を保持します。CPUはこのアドレスを使ってメモリから命令を読み出し、フェッチ後にPCを次の命令へ進める(通常は命令長分増加、分岐時は分岐先に変更)ことで命令実行の流れを制御します。
よくある誤解
- 「PCは命令そのものを保持する」と誤認する点:命令自体を保持するのは命令レジスタ(IR)であり、PCは命令の格納場所(アドレス)を保持します。
- 「条件分岐の判定に使う状態を保持する」と勘違いする点:条件判定に用いるフラグやステータスはフラグレジスタ(ステータスレジスタ)の役割です。
- 「メモリから読み出したデータを保持する」と混同する点:データは汎用レジスタやMDR(Memory Data Register)が保持します。
解法ステップ
- 問題文で「プログラムレジスタ(プログラムカウンタ)の役割」を問うていることを確認する。
- 各選択肢のキーワードをCPUのフェッチ・デコード・実行サイクルに当てはめる。
- 「アドレスを保持する」か「命令やデータ、状態を保持する」かで区別する。PCはアドレス保持が正しい。
- 分岐・割り込みなどでPCが更新される点を思い出して、正答を選ぶ。
選択肢別の誤答解説
- ア: 「演算を行うために、メモリから読み出したデータを保持する。」
→ 誤り。メモリから読み出したデータは汎用レジスタやMDR(Memory Data Register)が保持し、PCはアドレス保持に関与しません。 - イ: 「条件付き分岐命令を実行するために、演算結果の状態を保持する。」
→ 誤り。条件の状態(ゼロフラグ、キャリーフラグなど)はステータスレジスタやフラグレジスタに格納され、PCはその判定に基づき更新されるだけです。 - ウ: 「命令のデコードを行うために、メモリから読み出した命令を保持する。」
→ 誤り。命令を保持してデコードするのは命令レジスタ(IR)の役割であり、PCは命令へのアドレスを指します。 - エ: 「命令を読み出すために、次の命令が格納されたアドレスを保持する。」
→ 正解。PCは常に「次に読み出す命令のアドレス」を保持し、フェッチ後に更新されます。
補足コラム
- PCの更新方法:多くのRISC系では命令長が固定(例:4バイト)なのでフェッチ後に のように更新します。CISC系や可変長命令体系では命令長に応じて増分します。
- 分岐・割り込み:分岐命令はPCを書き換えて実行流を変更し、割り込み時は戻り先のアドレスを保存してPCを割り込みハンドラに設定します。
- 実装上の差異:x86では「IP(Instruction Pointer)」、ARMでは「PC」と呼ばれることが多く、幅(32ビット/64ビット)やパイプラインの影響でフェッチ中のPC値が1命令先を指す実装もあります。
- 簡易シミュレーション(Python例):
pc = 0x1000
instruction_length = 4 # バイト
# 命令をフェッチ(擬似)
def fetch(pc):
# 実際はメモリから命令を読み出す
return f"INSTR_AT_{hex(pc)}"
# フェッチしてPCを進める
instr = fetch(pc)
pc += instruction_length
print(instr, hex(pc))
FAQ
Q1: PCとIRの違いは?
A1: PCは「次の命令のアドレス」を保持するレジスタ、IRはそのアドレスから読み出された「命令そのもの」を保持してデコードします。
A1: PCは「次の命令のアドレス」を保持するレジスタ、IRはそのアドレスから読み出された「命令そのもの」を保持してデコードします。
Q2: 分岐命令が実行されるとPCはどうなる?
A2: 分岐命令が実行されるとPCは分岐先のアドレスに更新され、次のフェッチはそのアドレスから行われます。条件分岐の場合はフラグの判定結果によりPC更新の有無が決まります。
A2: 分岐命令が実行されるとPCは分岐先のアドレスに更新され、次のフェッチはそのアドレスから行われます。条件分岐の場合はフラグの判定結果によりPC更新の有無が決まります。
Q3: 割り込み時のPCの扱いは?
A3: 割り込み発生時は通常、現在の次実行アドレス(または戻り先アドレス)をスタックや指定レジスタに保存し、PCを割り込みハンドラの先頭アドレスに設定します。
A3: 割り込み発生時は通常、現在の次実行アドレス(または戻り先アドレス)をスタックや指定レジスタに保存し、PCを割り込みハンドラの先頭アドレスに設定します。
Q4: 「PCは読み取り専用か?」
A4: いいえ。プログラムやハードウェア(分岐命令、割り込み、システムコールなど)によってPCを書き換えることが可能です。
A4: いいえ。プログラムやハードウェア(分岐命令、割り込み、システムコールなど)によってPCを書き換えることが可能です。
関連キーワード: CPU、プログラムカウンタ、プログラムレジスタ、命令フェッチ、命令レジスタ、分岐制御、割り込み、PC更新、フェッチデコード実行、アドレス保持

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

