レジスタ vs メモリ
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 3/45。
コンピューターの中でデータを保存できる場所を2つ学びました。
- レジスター:CPUの内部にある小さな記憶領域
- メモリー(RAM):CPUの外部にある、番号付きスロットが並んだ巨大なグリッド
しかし、なぜ2か所あるのでしょうか?CPUはすべてをメモリに保持しないのでしょうか?
答えは速度です。レジスタはCPUの内部にあるため、非常に高速です。メモリはCPUの外部にあるため、より低速です。CPUは1サイクルでレジスタにアクセスできますが、メモリへのアクセスにははるかに時間がかかります。
比較:
| 特徴 | レジスタ | メモリ(RAM) |
|---|---|---|
| 場所 | CPUの内部 | CPUの外部 |
| 速度 | 非常に高速(1サイクル) | 低速(多くのサイクル) |
| 記憶スロットの数 | ごくわずか(x86-64では16〜32個) | 数百万または数十億 |
| 各スロットのサイズ | 8バイト(64ビット) | 1バイト |
| アクセス方法 | 名前でアクセス(rax、rbx、rcx...) | アドレスでアクセス(1000、msg、buffer) |
| 揮発性? | はい(電源を切ると消える) | はい(電源を切ると消える) |
アセンブリで最も重要なルール:
1つの命令で使用できるメモリオペランドは最大1つです。メモリ上にある2つの値を組み合わせるには、まずそのうち1つをレジスタに読み込んでください。
レジスタは、扱う値を保持しておく場所でもあります。メモリへのアクセスは毎回遅いためです。
常に使う3ステップのパターン:
| ステップ | 何が起こるか | 例 |
|---|---|---|
| 1. LOAD | メモリからレジスタにデータをコピーする | mov rax, [count] |
| 2. WORK | レジスタを使って何かをする | add rax, 5 |
| 3. STORE | 結果をメモリに戻してコピーする(必要な場合) | mov [result], rax |
このルールを忘れるとどうなりますか?
メモリ上にある2つの数値を足そうとすると、アセンブラーはエラーを出します。CPUにはそれができません。まず、どちらか一方をレジスターに読み込む必要があります。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド