CPUの基本動作
命令を読む、解読する、計算する、必要ならメモリへ行く、結果を戻す流れを追います。

この週でできるようになること
- ISAとマイクロアーキテクチャを区別できる。
- 命令の取得から書き戻しまでを追跡できる。
- 機械語、アセンブリ、高級言語の関係を説明できる。
- load/storeと算術命令でデータ経路が違うことを説明できる。
まず、具体的な場面から
メモリの値をレジスタへ読む。
レジスタの値を足し、結果を戻す。
条件に応じて次に読む命令の場所を変える。
見えてくること:命令の種類で使う部品は違いますが、『取得→解読→実行→必要ならメモリ→書き戻し』で整理できます。
ここで初めて、見えてきた関係を言葉や記号でまとめます。
IFは取得、IDは解読とレジスタ読出し、EXは演算、MEMはメモリアクセス、WBはレジスタへの書き戻しです。
なぜそうなる?
PCが次命令の位置を覚え、制御回路が命令を解読してデータ経路を選びます。すべての命令が5段すべてで同じ仕事をするわけではありません。
講義ノートで詳しく読む
元のMarkdownにある仕組み・図・用語を、順番に確認します。
1. ISAとは
ISA(Instruction Set Architecture)はソフトウェアから見えるCPUの契約です。
- 使用できる命令
- レジスタの種類と数
- データ型とビット幅
- メモリアドレスの扱い
- 例外・割り込みの基本動作
x86、Arm、RISC-VはISAまたはISAファミリーです。同じISAを実行するCPUでも、パイプライン段数、キャッシュ、実行ユニット数などの内部実装は異なります。この内部実装をマイクロアーキテクチャと呼びます。
2. プログラムが命令になるまで
C/Pythonなどのソース
↓ コンパイラ・処理系
アセンブリ
↓ アセンブラ
機械語(ビット列)
↓
CPUが命令として解釈
Pythonなどでは仮想機械やインタープリター、JITなどが間に入ることがあります。ここでは、最終的にCPUがそのISAの機械語を実行する点を押さえます。
3. 命令の基本構造
概念的な命令は、操作を示すopcodeと、対象を示すoperandからなります。
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段階の命令実行
基本モデルとして次を使います。
- IF(Instruction Fetch):PCが示すアドレスから命令を読む。
- ID(Instruction Decode / Register Fetch):命令を解読し、必要なレジスタを読む。
- EX(Execute):ALUで計算する。load/storeではアドレスを計算する。
- MEM(Memory Access):必要ならデータメモリを読む/書く。
- WB(Write Back):結果を宛先レジスタへ書く。
すべての命令が全段階で同じ仕事をするわけではありません。加算命令はMEMで何もしない場合があり、store命令には通常レジスタへのWBがありません。
5. 命令を追跡する
初期状態を次とします。
R1 = 100
Memory[100] = 7
R2 = 5
命令:LOAD R3, [R1]
IF : 命令を取得
ID : R1=100を読み出す
EX : 実効アドレス100を計算
MEM : Memory[100]から7を読む
WB : R3へ7を書く
次の命令:ADD R4, R3, R2
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が実行時間を切り替える効果も含みます。
例題で確かめる
R1=100、Memory[100]=7、R2=5。LOAD R3,[R1] のあと ADD R4,R3,R2 を実行すると?
- LOADのEXでアドレス100を得て、MEMで7を読み、WBでR3=7。
- ADDのIDでR3=7とR2=5を読み、EXで7+5=12。
- ADDのWBでR4へ12を書く。
答え:R3=7、R4=12。ADDではデータメモリへのアクセスを使いません。
実習
Nand2Tetris CPU Emulatorを開きます。
@value、D=A、M=Dなど簡単なHack命令を一命令ずつ進める。- Aレジスタ、Dレジスタ、PC、RAMの変化を表へ記録する。
- ジャンプ命令でPCが連続増加しない場合を確認する。
- 同じプログラムを連続実行し、単ステップ観察との違いを記録する。
記録表:
| step | PC | instruction | A | D | changed memory |
|---|---|---|---|---|---|
| 0 |
説明課題
LOADとADDを、IF・ID・EX・MEM・WBの各段階で比較してください。
練習問題
元ノートの小テストです。まず自分で答えを考え、必要なら下の答えを開いてください。
ISAはソフトウェアから見える仕様か、物理的な配線図か。
答えと考え方を見る
ソフトウェアから見える仕様。
命令を解読しレジスタを読む段階は何か。
答えと考え方を見る
ID。
load命令でメモリアドレスを計算する段階は何か。
答えと考え方を見る
EX。
PCの値を変更する代表的な命令を一つ答えよ。
答えと考え方を見る
条件分岐、無条件ジャンプ、関数呼び出しなど。
同じISAのCPUで性能が異なり得る理由を答えよ。
答えと考え方を見る
同じISAでもパイプライン、実行幅、キャッシュ、分岐予測、周波数などのマイクロアーキテクチャが異なるため。