命令が動く仕組み
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 4/45。
CPUが命令を一つずつ実行することはご存知でしょう。しかし、CPUは次にどの命令を実行すべきかをどのようにして知るのでしょうか?命令はどこに格納されているのでしょうか?そして、命令とは実際にはどのようなものなのでしょうか?
命令は数値です。
これはコンピュータに関する根本的な真理です。すべては数字です。あなたが扱うデータ(42という数値など)は数字です。データが存在するアドレス(1000など)も数字です。そして、命令そのもの(mov、add、cmpなど)もまた数字なのです。
mov rax, 5 のようなアセンブリコードを書くと、アセンブラはこの人間が読めるテキストを CPU が理解できる数値に変換します。この数値は 命令コード(インストラクションコード) と呼ばれます。
命令はどこに格納されますか?
命令は、データと同じようにメモリに格納されます。命令のための特別な場所はありません。メモリは両方を保持します:
- データ (数値、文字、配列)
- 命令 (プログラム自体)
CPUはその違いを知りません。それは単に、Program Counterが指し示すメモリ番地にあるものを読み取るだけです。Lesson 0.1でPCについて簡単に学びました。今こそ、それがどのように機能するのかを正確に理解する時です。
プログラムカウンタ(インストラクションポインタとも呼ばれます)は、CPU内部にある特殊なレジスタです。その唯一の役割は、次に実行する命令のメモリアドレスを保持することです。
フェッチ・実行サイクル:
CPUは、これら3つのステップを永久に繰り返します:
| ステップ | 動作 |
|---|---|
| 1. フェッチ (FETCH) | PC内のアドレスにある命令を読み取ります |
| 2. 実行 (EXECUTE) | その命令を実行します |
| 3. 更新 (ADVANCE) | PCを次の命令に進めます |
簡単な例:
PC = 1000 の場合、CPUは以下のように動作します:
- アドレス 1000 にある命令をフェッチ(取得)します
- それを実行します
- PC を次のアドレス(1000 + 命令サイズ)に移動させます
その後、新しいPC値で繰り返されます。
命令の構成:
すべての命令は2つの部分で構成されています:
| 部分 | 役割 | 例 |
|---|---|---|
| オペコード | 何を「実行するか」 | mov, add, cmp |
| オペランド | 何に「対して行うか」 | rax, 5, [result] |
命令の中には、1つのオペランドを持つもの(1を加算するinc raxなど)、2つのオペランドを持つもの(mov rax, 5など)、そして一部のアーキテクチャでは3つのオペランドを持つもの(add rax, rbx, rcxなど)があります。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。