レジスタ vs メモリ
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 3/45。
これで、コンピュータ内部でデータが存在できる2つの場所について学習しました:
- レジスタ — CPU内部にある小さなストレージボックス
- メモリ (RAM) — CPUの外部にある、番号が付いたスロットの巨大なグリッド
しかし、なぜ2つの場所があるのでしょうか?なぜCPUはメモリと直接やり取りできないのでしょうか?
答えは速度です。レジスタはCPUの内部にあるため、非常に高速です。メモリは外部にあるため、より低速です。CPUは1サイクルでレジスタにアクセスできますが、メモリへのアクセスにははるかに長い時間がかかります。
比較表:
| 特徴 | レジスタ | メモリ (RAM) |
|---|---|---|
| 場所 | CPU内部 | CPU外部 |
| 速度 | 極めて高速 (1サイクル) | より低速 (多数のサイクル) |
| 格納場所の数 | 非常に少ない (x86-64では16-32個) | 数百万から数十億 |
| 各スロットのサイズ | 8バイト (64ビット) | 1バイト |
| アクセス方法 | 名前による (rax, rbx, rcx...) | アドレスによる (1000, msg, buffer) |
| 揮発性? | はい (電源を切ると消失) | はい (電源を切ると消失) |
アセンブリにおける最も重要なルール:
CPUはメモリ内のデータを直接操作することはできません。データはまずレジスタにロードされる必要があります。
これは選択の余地があることではありません。それがCPUの設計というものです。すべての加算、すべての比較、すべてのデータの移動は、レジスタを経由しなければなりません。
常に使用することになる3ステップのパターン:
| ステップ | 内容 | 例 |
|---|---|---|
| 1. LOAD(ロード) | メモリからレジスタにデータをコピーする | mov rax, [count] |
| 2. WORK(処理) | レジスタを使用して何らかの処理を行う | add rax, 5 |
| 3. STORE(ストア) | 結果をメモリに書き戻す(必要な場合) | mov [result], rax |
このルールを忘れるとどうなりますか?
両方がメモリ内にある2つの数値を加算しようとすると、アセンブラはエラーを出力します。CPUにはそれができません。まずそれらをレジスタにロードする必要があります。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。