最終更新日:2026年8月29日
fe fe-technology computer-architecture cpu
まず結論
CPU内部のレジスタは、何を保持するかで切り分けます。
まず、問題文に出てくるものが データ・命令・アドレス・演算結果の状態 のどれなのかを確認すると判断しやすくなります。
演算に使うデータ?
→ データレジスタ・汎用レジスタ
読み出した命令そのもの?
→ 命令レジスタ
次の命令がある場所(アドレス)?
→ プログラムカウンタ
演算結果が0か、桁上がりしたかなどの状態?
→ フラグレジスタ
| レジスタ・装置 | 主に保持するもの |
|---|---|
| プログラムカウンタ | 次に実行する命令のアドレス |
| 命令レジスタ | 主記憶から読み出した現在の命令 |
| インデックスレジスタ | アドレス計算に加える添字の値 |
| データレジスタ | 演算や転送に使うデータ |
| 汎用レジスタ | データ・途中結果・アドレスなど |
| アキュムレータ | 主に演算結果 |
| フラグレジスタ | 演算結果の状態 |
| データキャッシュ | よく使うデータのコピー |
基本情報技術者試験では、次の判断軸が重要です。
割込み後に元の場所から処理を再開する
→ プログラムカウンタを退避・復元する
住所はプログラムカウンタ、命令の中身は命令レジスタ、計算用の値はデータ系レジスタ。
直感的な説明
プログラムカウンタは、本のしおりのようなものです。
本を読む途中で電話に出ても、しおりがあれば元のページから読書を再開できます。
CPUでも同じです。
通常のプログラムを実行
↓
割込みが発生
↓
プログラムカウンタを退避
↓
割込み処理を実行
↓
プログラムカウンタを復元
↓
元の処理を再開
一方、命令レジスタは、しおりが示した場所から取り出した命令の内容を置く場所です。
プログラムカウンタ
→ 次に読む場所
命令レジスタ
→ 読み出した命令そのもの
場所を覚えるのか、内容を覚えるのかで切り分けます。
定義・仕組み
CPUは、命令をおおむね次の流れで実行します。
1. 次の命令の場所を確認する
2. 主記憶から命令を読み出す
3. 命令を保持する
4. 命令を解読する
5. 必要なデータを読み込む
6. 演算する
7. 結果や状態を保存する
各レジスタを対応させると、次のようになります。
プログラムカウンタ
↓ 次の命令のアドレスを示す
主記憶
↓ 命令を読み出す
命令レジスタ
↓ 命令を保持する
命令デコーダ
↓ 命令を解読する
演算装置
↓ 演算する
データレジスタ・汎用レジスタ・アキュムレータ
→ データや演算結果を保持する
この流れを先に整理したい場合は、CPUの命令実行サイクルとは?フェッチ・解読・オペランド読出し・実行の順番を確認すると、各レジスタがどの段階で関わるのかをつなげて理解できます。
プログラムカウンタ
次に実行する命令のアドレスを保持します。
次はどこを読むか
→ プログラムカウンタ
通常は命令を読み出すたびに、次の命令を指すように更新されます。分岐命令では、分岐先のアドレスが設定されます。
命令レジスタ
主記憶から読み出した、現在実行する命令そのものを保持します。
主記憶
↓
命令レジスタ
↓
命令デコーダ
命令レジスタの内容は命令デコーダへ渡され、どの処理を行う命令なのかが解読されます。
インデックスレジスタ
配列などの要素を順番に参照するとき、アドレス計算へ加える値を保持します。
基準となるアドレス
+
インデックスレジスタの値
=
実際に参照するアドレス
試験では、次の表現が判断材料になります。
配列
添字
繰返し
アドレス部に値を加える
→ インデックスレジスタ
アドレス指定方式との関係は、アドレス指定方式の記事でも確認できます。
データレジスタ
演算やデータ転送に使う値を一時的に保持します。
主記憶から読み出したデータ
演算に使う値
転送中の値
→ データレジスタ
CPUによって名称や役割の分け方は異なり、汎用レジスタと近い意味で使われることもあります。FE試験では、問題文に「データを一時保持」とあれば、命令やアドレスではなくデータを保持するレジスタだと判断します。
汎用レジスタ
演算に使うデータ、途中結果、アドレスなどを一時的に保持します。
計算に使う値
途中の結果
一時的なアドレス
→ 汎用レジスタ
「汎用」という名前のとおり、用途が一つに固定されていません。
アキュムレータ
主に演算結果を保持するレジスタです。
演算結果
→ アキュムレータ
現在のCPUでは、汎用レジスタが同様の役割を兼ねることもあります。
フラグレジスタ
演算結果そのものではなく、演算結果の状態を保持します。
- 結果が0か
- 桁上がりが発生したか
- 結果が負か
- オーバーフローしたか
演算を実行
↓
結果の状態をフラグへ記録
↓
条件分岐で利用
データキャッシュ
CPUがよく使うデータのコピーを保持し、主記憶へのアクセスを減らす高速な記憶領域です。
CPU
↓ 高速
データキャッシュ
↓
主記憶
キャッシュはCPUに内蔵されることがありますが、レジスタとは別の記憶階層です。
割込み発生時の退避と復元
割込みが発生すると、CPUは実行中のプログラムをいったん中断し、割込み処理へ移ります。
処理を中断した場所へ戻るには、プログラムカウンタの値を失わないようにする必要があります。
1. 割込みが発生する
2. プログラムカウンタなどをスタックへ退避する
3. 割込み処理の開始アドレスを設定する
4. 割込み処理を実行する
5. 退避した値を復元する
6. 元のプログラムを再開する
退避
→ あとで戻すために一時保存する
復元
→ 保存していた値を元へ戻す
割込みの分類や基本的な流れは、内部割込みと外部割込みの記事でも整理しています。
科目Aでどう出る?
科目Aでは、説明文やCPU内部の図を見て、該当するレジスタを選ぶ問題が出ます。
最初に、「何を保持している説明なのか」を分類します。
データ
→ データレジスタ・汎用レジスタ
命令
→ 命令レジスタ
命令のアドレス
→ プログラムカウンタ
演算結果の状態
→ フラグレジスタ
「メモリから読み出す」という言葉だけでは決めません。読み出したものがデータなのか、命令なのかまで確認します。
| 問題文の表現 | 選ぶもの |
|---|---|
| 次の命令が格納されたアドレス | プログラムカウンタ |
| 割込み後に元の場所から再開 | プログラムカウンタ |
| 主記憶から読み出した現在の命令 | 命令レジスタ |
| 配列の添字をアドレスへ加える | インデックスレジスタ |
| 演算や転送に使うデータ | データレジスタ |
| データや途中結果を幅広く保持 | 汎用レジスタ |
| 演算結果を保持 | アキュムレータ |
| ゼロ・桁上がりなどの状態 | フラグレジスタ |
| よく使うデータを高速に保持 | データキャッシュ |
選択肢を4方向に切る
似た説明が並んだら、次の順で切り分けると安定します。
| 問題文で中心になっているもの | 判断 |
|---|---|
| 演算に使うデータ | データレジスタ・汎用レジスタ |
| 条件分岐に使う演算結果の状態 | フラグレジスタ |
| 読み出した命令そのもの | 命令レジスタ |
| 次に読む命令のアドレス | プログラムカウンタ |
特に、「命令」と「命令のアドレス」は別物です。
命令そのもの
→ 命令レジスタ
命令が置かれている場所
→ プログラムカウンタ
割込み問題の判断手順
中断した処理を元の場所から再開したい
↓
戻る場所のアドレスが必要
↓
アドレスを保持するのはプログラムカウンタ
4種類を一言で切る
| 用語 | 一言でいうと |
|---|---|
| インデックスレジスタ | 配列の位置をずらす |
| データレジスタ | データを一時保存する |
| プログラムカウンタ | 次の命令の場所を覚える |
| 命令レジスタ | 現在の命令を覚える |
図を見たときの判断基準
| 図の位置・接続 | 選びたい装置 |
|---|---|
| 次の命令の場所を主記憶へ示す | プログラムカウンタ |
| 主記憶と命令デコーダの間 | 命令レジスタ |
| アドレス計算へ加算される | インデックスレジスタ |
| 演算装置へデータを渡す | データレジスタ・汎用レジスタ |
| 演算装置の結果を受け取る | アキュムレータ・汎用レジスタ |
| 演算結果の状態を記録する | フラグレジスタ |
| CPUと主記憶の速度差を埋める | キャッシュ |
どんな場面で使う?
プログラムカウンタ
命令の実行順序、分岐、ジャンプ、割込み後の再開位置を管理するときに使います。
命令レジスタ
現在実行する命令を保持し、命令デコーダへ渡すときに使います。
インデックスレジスタ
配列や表の要素を順番に参照するときに使います。
データレジスタ・汎用レジスタ・アキュムレータ
演算対象の値、転送する値、途中結果、演算結果を一時的に保持するときに使います。
フラグレジスタ
比較結果や演算結果を使って条件分岐するときに使います。
データキャッシュ
主記憶から同じデータを何度も読み出す負担を減らし、処理を高速化するときに使います。
よくある誤解・混同
プログラムカウンタと命令レジスタ
プログラムカウンタ
→ 次の命令の住所
命令レジスタ
→ 現在の命令の内容
住所を持つのがプログラムカウンタ、内容を持つのが命令レジスタ。
「メモリから読み出した」なら命令レジスタ?
そうとは限りません。
主記憶から読み出すものには、命令だけでなく演算に使うデータもあります。
読み出したデータ
→ データレジスタ・汎用レジスタ
読み出した命令
→ 命令レジスタ
どこから読み出したかではなく、何を保持しているかで判断します。
割込み時は命令レジスタを保存すればよい?
命令レジスタには命令の内容が入っていますが、それだけではプログラム全体のどこへ戻るか分かりません。
命令の内容が分かる
≠
命令が置かれている場所が分かる
処理の再開には、戻り先のアドレスを保持するプログラムカウンタが必要です。
プログラムカウンタは現在の命令を指す?
名称やCPUの動作段階によって説明の仕方に差はありますが、FE試験では基本的に「次に実行する命令のアドレスを保持する」と整理します。
割込みでは、再開時に必要な命令位置を保存するものとして判断します。
インデックスレジスタとプログラムカウンタ
どちらもアドレスに関係しますが、役割が違います。
インデックスレジスタ
→ データの参照位置をずらす
プログラムカウンタ
→ 次の命令位置を示す
データレジスタと命令レジスタ
データレジスタ
→ 演算や転送に使うデータ
命令レジスタ
→ CPUが実行する命令
「何かを保持する」という点だけでなく、保持する内容を確認します。
汎用レジスタとアキュムレータ
汎用レジスタ
→ データや途中結果を幅広く保持
アキュムレータ
→ 主に演算結果を保持
フラグレジスタは演算結果を保持する?
フラグレジスタが保持するのは、演算結果そのものではなく状態です。
演算結果そのもの
→ 汎用レジスタやアキュムレータ
演算結果の状態
→ フラグレジスタ
プログラムカウンタは命令数を数える?
「カウンタ」という名前ですが、実行した命令数を数えるものではありません。保持するのは命令のアドレスです。
キャッシュはレジスタと同じ?
同じではありません。
レジスタ
↓
キャッシュ
↓
主記憶
↓
補助記憶
上ほど高速で小容量、下ほど低速で大容量です。
まとめ(試験直前用)
- データ・命令・アドレス・状態のどれを保持するかでレジスタを切り分ける
- 次の命令のアドレスを保持するのがプログラムカウンタ
- 現在の命令を保持するのが命令レジスタ
- 演算や転送に使う値はデータレジスタ・汎用レジスタ
- 演算結果の状態はフラグレジスタ
- 「メモリから読み出す」だけで決めず、読み出したものが何かを見る
- 割込み後に元の場所から再開するため、プログラムカウンタを退避・復元する
データ?
→ データ系レジスタ
命令そのもの?
→ 命令レジスタ
次の命令の場所?
→ プログラムカウンタ
結果の状態?
→ フラグレジスタ
住所はプログラムカウンタ、命令の中身は命令レジスタ、計算用の値はデータ系レジスタ。