# Week 6：CPUの基本動作

## 今週のゴール

- ISAとマイクロアーキテクチャを区別できる。
- 命令の取得から書き戻しまでを追跡できる。
- 機械語、アセンブリ、高級言語の関係を説明できる。
- load/storeと算術命令でデータ経路が違うことを説明できる。

## 1. ISAとは

ISA（Instruction Set Architecture）はソフトウェアから見えるCPUの契約です。

- 使用できる命令
- レジスタの種類と数
- データ型とビット幅
- メモリアドレスの扱い
- 例外・割り込みの基本動作

x86、Arm、RISC-VはISAまたはISAファミリーです。同じISAを実行するCPUでも、パイプライン段数、キャッシュ、実行ユニット数などの内部実装は異なります。この内部実装をマイクロアーキテクチャと呼びます。

## 2. プログラムが命令になるまで

```text
C/Pythonなどのソース
  ↓ コンパイラ・処理系
アセンブリ
  ↓ アセンブラ
機械語（ビット列）
  ↓
CPUが命令として解釈
```

Pythonなどでは仮想機械やインタープリター、JITなどが間に入ることがあります。ここでは、最終的にCPUがそのISAの機械語を実行する点を押さえます。

## 3. 命令の基本構造

概念的な命令は、操作を示すopcodeと、対象を示すoperandからなります。

```text
ADD R1, R2, R3   ; R1 ← R2 + R3
LOAD R1, [R2]    ; R2が示すメモリからR1へ読む
STORE R1, [R2]   ; R1をR2が示すメモリへ書く
BEQ R1, R2, L    ; 等しければLへ分岐
```

実際の表記と動作はISAにより異なります。

## 4. 5段階の命令実行

基本モデルとして次を使います。

1. **IF（Instruction Fetch）**：PCが示すアドレスから命令を読む。
2. **ID（Instruction Decode / Register Fetch）**：命令を解読し、必要なレジスタを読む。
3. **EX（Execute）**：ALUで計算する。load/storeではアドレスを計算する。
4. **MEM（Memory Access）**：必要ならデータメモリを読む／書く。
5. **WB（Write Back）**：結果を宛先レジスタへ書く。

すべての命令が全段階で同じ仕事をするわけではありません。加算命令はMEMで何もしない場合があり、store命令には通常レジスタへのWBがありません。

## 5. 命令を追跡する

初期状態を次とします。

```text
R1 = 100
Memory[100] = 7
R2 = 5
```

命令：`LOAD R3, [R1]`

```text
IF  : 命令を取得
ID  : R1=100を読み出す
EX  : 実効アドレス100を計算
MEM : Memory[100]から7を読む
WB  : R3へ7を書く
```

次の命令：`ADD R4, R3, R2`

```text
IF  : 命令を取得
ID  : R3=7、R2=5を読む
EX  : 7+5=12
MEM : 使用しない
WB  : R4へ12を書く
```

## 6. 分岐

条件分岐では比較結果に応じてPCを変更します。次に読む命令が確定するまで待つとパイプラインが止まるため、現代CPUでは分岐予測が重要になります。

ループ、if文、関数呼び出しは制御の流れを変えます。CPUはこの複雑な流れを高速に扱うよう設計されています。

## 7. CPUとOS

CPUは単独でアプリを管理するわけではありません。OSがプロセス、仮想メモリ、入出力、割り込みなどを管理し、CPUの特権機構を利用します。同じコアで複数プログラムが動いて見えるのは、OSが実行時間を切り替える効果も含みます。

## 実習

Nand2Tetris CPU Emulatorを開きます。

1. `@value`、`D=A`、`M=D`など簡単なHack命令を一命令ずつ進める。
2. Aレジスタ、Dレジスタ、PC、RAMの変化を表へ記録する。
3. ジャンプ命令でPCが連続増加しない場合を確認する。
4. 同じプログラムを連続実行し、単ステップ観察との違いを記録する。

記録表：

| step | PC | instruction | A | D | changed memory |
|---:|---:|---|---:|---:|---|
| 0 |  |  |  |  |  |

## 説明課題

`LOAD`と`ADD`を、IF・ID・EX・MEM・WBの各段階で比較してください。

## 小テスト

1. ISAはソフトウェアから見える仕様か、物理的な配線図か。
2. 命令を解読しレジスタを読む段階は何か。
3. load命令でメモリアドレスを計算する段階は何か。
4. PCの値を変更する代表的な命令を一つ答えよ。
5. 同じISAのCPUで性能が異なり得る理由を答えよ。

[解答](../answers.md#week-6)

