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