---
title: "プログラムカウンタとは？命令レジスタ・アキュムレータ・キャッシュの違い【基本情報技術者試験】"
description: "プログラムカウンタを、次に実行する命令のアドレスを保持するレジスタとして整理します。命令レジスタ、汎用レジスタ、アキュムレータ、フラグレジスタ、データキャッシュの違いと、命令フェッチからデコードまでの流れをFE試験向けに解説します。"
last_modified_at: "2026-07-19"
canonical_url: "https://stemtazoo.github.io/fe/cpu-registers/"
section: "fe"
---

## まず結論

CPU内部のレジスタは、**何を保持するか**で切り分けます。

| 装置 | 主に保持するもの |
|---|---|
| プログラムカウンタ | 次に実行する命令のアドレス |
| 命令レジスタ | 主記憶から読み出した現在の命令 |
| 汎用レジスタ | 演算に使うデータや途中結果 |
| アキュムレータ | 主に演算結果 |
| フラグレジスタ | 演算結果の状態 |
| データキャッシュ | よく使うデータのコピー |

試験では、次の一文を判断軸にします。

> **住所はプログラムカウンタ、命令の中身は命令レジスタ、計算結果はアキュムレータ。**

特に、主記憶から命令が取り出され、その後に命令デコーダへ渡される図では、途中にある装置は命令レジスタです。

```text
主記憶
↓ 命令をフェッチ
命令レジスタ
↓
命令デコーダ
```

## 直感的な説明

プログラムカウンタは、本の**しおり**のようなものです。

本を読んでいるとき、しおりは「次に読むページ」を示します。CPUでも同じように、プログラムカウンタが「次に読み出す命令の場所」を示します。

```text
プログラムカウンタ
↓
次の命令のアドレスを示す
↓
主記憶から命令を読み出す
```

一方、命令レジスタは、しおりが示したページから実際に取り出した**命令の内容**を置く場所です。

```text
プログラムカウンタ
→ 次に読む場所

命令レジスタ
→ 読み出した命令そのもの
```

アキュムレータは、計算の途中で得た答えを一時的に置く場所と考えると分かりやすいです。

## 定義・仕組み

CPUは、命令を次の流れで実行します。

```text
1. 次の命令の場所を確認する
2. 主記憶から命令を読み出す
3. 命令を保持する
4. 命令を解読する
5. 必要なデータを読み込む
6. 演算する
7. 結果や状態を保存する
```

この流れに各装置を対応させると、役割が分かりやすくなります。

```text
プログラムカウンタ
↓ 次の命令のアドレスを示す

主記憶
↓ 命令を読み出す

命令レジスタ
↓ 命令を保持する

命令デコーダ
↓ 命令を解読する

演算装置
↓ 演算する

汎用レジスタ・アキュムレータ
→ データや演算結果を保持する
```

### プログラムカウンタ

次に実行する命令の**アドレス**を保持します。

```text
次はどこを読むか
→ プログラムカウンタ
```

命令を読み出した後は、通常、次の命令を指すように値が更新されます。分岐命令の場合は、分岐先のアドレスが設定されます。

### 命令レジスタ

主記憶から読み出した、現在実行する**命令そのもの**を保持します。

```text
読み出した命令
→ 命令レジスタ
```

命令レジスタの内容は命令デコーダへ渡され、どの処理を行う命令なのかが解読されます。

```text
主記憶
↓
命令レジスタ
↓
命令デコーダ
```

図でこの接続関係が示されていたら、命令レジスタを選びます。

### 汎用レジスタ

演算に使うデータ、途中結果、アドレスなどを一時的に保持します。

```text
計算に使う値
途中の結果
一時的なアドレス
→ 汎用レジスタ
```

「汎用」という名前のとおり、用途が一つに固定されていません。

### アキュムレータ

主に演算結果を保持するレジスタです。

```text
演算結果
→ アキュムレータ
```

古典的なCPUでは、演算結果をアキュムレータへ集めて処理します。現在のCPUでは、汎用レジスタが同様の役割を兼ねることもあります。

### フラグレジスタ

演算結果そのものではなく、演算結果の**状態**を保持します。

例えば、次の状態です。

- 結果が0か
- 桁上がりが発生したか
- 結果が負か
- オーバーフローしたか

```text
演算を実行
↓
結果の状態をフラグに記録
↓
条件分岐で利用
```

### データキャッシュ

CPUがよく使うデータのコピーを保持し、主記憶へのアクセスを減らすための高速な記憶領域です。

```text
CPU
↓ 高速
データキャッシュ
↓
主記憶
```

データキャッシュはデータを高速に読み出すための装置であり、現在の命令そのものを保持して命令デコーダへ渡す命令レジスタとは役割が異なります。

また、キャッシュはCPUに内蔵されることがありますが、レジスタとは別の記憶階層です。

## 科目Aでどう出る？

科目Aでは、説明文やCPU内部の図を見て名称を選ぶ問題がよく出ます。

判断するときは、選択肢に含まれる中心語を確認します。

```text
次の命令のアドレス
→ プログラムカウンタ

主記憶から取り出した命令
→ 命令レジスタ

演算用データや途中結果
→ 汎用レジスタ

演算結果
→ アキュムレータ

演算結果の状態
→ フラグレジスタ

よく使うデータを高速に保持
→ データキャッシュ
```

### 図を見たときの判断基準

CPUの図では、矢印の前後を見ると判断しやすくなります。

| 図の位置・接続 | 選びたい装置 |
|---|---|
| 次の命令の場所を主記憶へ示す | プログラムカウンタ |
| 主記憶と命令デコーダの間 | 命令レジスタ |
| 演算装置の結果を受け取る | アキュムレータや汎用レジスタ |
| 演算結果の状態を記録する | フラグレジスタ |
| CPUと主記憶の速度差を埋める | キャッシュ |

特に、次の形は頻出です。

```text
主記憶 → a → 命令デコーダ
```

この場合、`a` は主記憶からフェッチした命令を一時的に保持するため、命令レジスタです。

### 典型的な切り分け

| 選択肢の表現 | 対応する装置 |
|---|---|
| 次の命令が格納されたアドレスを保持 | プログラムカウンタ |
| 主記憶から読み出した命令を保持 | 命令レジスタ |
| 演算のためにデータを一時保持 | 汎用レジスタ |
| 演算結果を保持 | アキュムレータ |
| ゼロ、桁上がりなどの状態を保持 | フラグレジスタ |
| よく使うデータを高速に保持 | データキャッシュ |

## どんな場面で使う？

### プログラムカウンタ

命令の実行順序を管理するときに使います。

通常は順番に命令を実行しますが、条件分岐やジャンプが起きると、プログラムカウンタの値を書き換えます。

```text
条件を満たす
↓
分岐先アドレスをプログラムカウンタへ設定
↓
分岐先の命令を実行
```

### 命令レジスタ

現在実行する命令を解読するときに使います。

```text
命令を読み出す
↓
命令レジスタに保持
↓
命令デコーダが解読
```

### アキュムレータ・汎用レジスタ

演算対象の値や演算結果を一時的に保持するときに使います。

### フラグレジスタ

条件付き分岐で使います。

例えば、比較結果が等しい場合だけ分岐する処理では、ゼロフラグなどを確認します。

### データキャッシュ

主記憶から同じデータを何度も読み出す負担を減らし、処理を高速化するときに使います。

## よくある誤解・混同

### プログラムカウンタと命令レジスタ

最も混同しやすい組合せです。

```text
プログラムカウンタ
→ 次の命令の住所

命令レジスタ
→ 現在の命令の内容
```

例えば、100番地に命令がある場合は次のようになります。

```text
プログラムカウンタ
→ 100

命令レジスタ
→ 100番地から読み出した命令
```

> **住所を持つのがプログラムカウンタ、内容を持つのが命令レジスタ。**

### 命令レジスタとデータキャッシュ

どちらもCPUの近くで情報を保持しますが、保持するものが違います。

```text
命令レジスタ
→ 現在解読する命令そのもの

データキャッシュ
→ よく使うデータのコピー
```

主記憶から命令を取り出し、その直後に命令デコーダへ渡す位置なら命令レジスタです。

### 汎用レジスタとアキュムレータ

どちらも演算に使われるため混同しやすいです。

```text
汎用レジスタ
→ データや途中結果を幅広く保持

アキュムレータ
→ 主に演算結果を保持
```

### フラグレジスタは演算結果を保持する？

フラグレジスタが保持するのは、演算結果そのものではありません。

```text
演算結果そのもの
→ 汎用レジスタやアキュムレータ

演算結果の状態
→ フラグレジスタ
```

### プログラムカウンタは命令数を数える？

名称に「カウンタ」とありますが、実行した命令数を数えるものではありません。

保持するのは、次の命令がある**アドレス**です。

### キャッシュはレジスタと同じ？

同じではありません。

一般的な記憶階層は次のようになります。

```text
レジスタ
↓
キャッシュ
↓
主記憶
↓
補助記憶
```

上ほど高速で小容量、下ほど低速で大容量です。

## まとめ（試験直前用）

- **次の命令のアドレス**を保持するのがプログラムカウンタ
- **主記憶から読み出した現在の命令**を保持するのが命令レジスタ
- **演算用データや途中結果**を保持するのが汎用レジスタ
- **演算結果**を保持するのがアキュムレータ
- **演算結果の状態**を保持するのがフラグレジスタ
- **よく使うデータのコピー**を保持するのがデータキャッシュ

試験直前には、次の順で思い出します。

```text
次はどこ？
→ プログラムカウンタ

今の命令は何？
→ 命令レジスタ

計算に使う値は？
→ 汎用レジスタ

計算結果は？
→ アキュムレータ

結果の状態は？
→ フラグレジスタ

よく使うデータは？
→ データキャッシュ
```

> **住所はプログラムカウンタ、命令の中身は命令レジスタ、計算結果はアキュムレータ。**
