機械語命令フォーマット(Opcode / A / B)とワード構造の解剖
なぜメモリの箱は「3つの部屋」に分かれているのか? CPUが1行の命令を解釈するための固定長ワード設計
メモリの列見出しヘッダーを見てみましょう。 CoreWarのメモリは、1行(1つの箱)が必ず 3つの部屋 に分かれています: 1. [命令 (Opcode)]: 何をするか(DAT, ADD, MOV など) 2. [A (左の値)]: 左側の数値(Aフィールド) 3. [B (右の値)]: 右側の数値(Bフィールド)
特に B(右の部屋) は、データをしまっておくメインの引き出しとしてよく使われます。
🎯 やってみよう 0000 番地にある DAT #0, #0 の B(右の値) だけを + ボタン(または直接クリックして数値入力)で 5 に書き換えて、[STEP] を押しましょう!
1. メモリの1行は「1つの構造体(ワード)」である
Step 4では、メモリの1行(1つの箱)が必ず「命令(Opcode)」「A(左の値)」「B(右の値)」という3つの部屋に分かれていることを学び、その一番右の部屋(Bフィールド)の値を『5』に書き換えました。
初めてアセンブリ言語や機械語に触れる人がよく抱く疑問があります。「なぜ普通のメモ帳のように好きな文字を自由に書けるのではなく、わざわざ3つの部屋に区切られた窮屈な箱に数字を入れなければならないのか?」と。
その答えは、CPUというハードウェアが「定型のフォーマット(決まった形の箱)」しか高速に読み取れないからです。人間なら『右の箱に5を入れておいて』という自由な日本語を読めますが、シリコンの電子回路であるCPUには自然言語を読む知能はありません。その代わり、1つのメモリ番地(1ワード)を「①何をする命令か(Opcode)」「②1つ目の数値(Aフィールド)」「③2つ目の数値(Bフィールド)」という固定の区画にきっちりと分割しておくことで、CPUは配線を繋ぐだけで瞬時にそれぞれの値を取り出すことができるのです。
┌─────────────────────────────────────────────────────────────┐
│ 1 Memory Cell (ICWS-94 Instruction Word) │
├───────────────────┬────────────────────┬────────────────────┤
│ Room 1: OPCODE │ Room 2: A-FIELD │ Room 3: B-FIELD │
│ (Action + Mod) │ (Mode + A-Value) │ (Mode + B-Value) │
│ DAT.F │ #0 │ #5 │
└───────────────────┴────────────────────┴────────────────────┘2. RISCアーキテクチャと固定長命令の美学
コンピュータの歴史において、CPUの命令設計には大きく分けて2つの流派が存在します。1つはIntelのx86プロセッサに代表される「CISC(複合命令セットコンピュータ)」で、1つの命令の長さが1バイトから15バイトまでバラバラ(可変長)です。もう1つは、Apple Silicon(M1/M2/M3/M4)やスマートフォンのARMプロセッサ、そして最新のオープン規格RISC-Vに代表される「RISC(縮小命令セットコンピュータ)」であり、すべての命令が「きっちり同じサイズ(例:32ビット固定長)」の箱に収まっています。
CoreWarの仮想CPUであるMARS(ICWS-94規格)は、このRISCの哲学を極限まで純粋化したアーキテクチャです。CoreWarでは、どんなに単純なデータ箱(DAT)であっても、どんなに複雑な比較命令(SEQ)や分裂命令(SPL)であっても、必ず「メモリ1マス=1命令ワード(Opcode + A + B)」という完全に均一なサイズで格納されます。
すべての命令とデータが「1マス」という同じ大きさのブロックだからこそ、プログラムカウンタは常に『+1』するだけで次の命令へ進め、また『MOV』命令はどんな命令であっても1マス単位で綺麗にコピーすることができるのです。
3. なぜ「B(右の部屋)」がデータの主役なのか?
今回、私たちはA(左の部屋)ではなく、あえて「B(右の部屋)」に『5』という数値を入れました。実はCoreWarの世界には、「単なる数値を1つだけデータ箱(DAT)に保存したいときは、慣習として右側のBフィールドを使う」という重要な設計ルールがあります。
なぜ左のAではなく右のBなのでしょうか? それは、後ほど学ぶ足し算(ADD.AB #2, $1)や間接ポインタ(@)などの多くの標準動作が、「左のAから数値を取り出し、右のBの部屋へ書き込む(またはBの部屋の数値をポインタとして参照する)」ように設計されているからです。つまり、右側のBフィールドは「計算結果が流れ込むメインの貯蔵庫」としての役割を担っています。この「Bの部屋がデータの主役である」という感覚を掴んでおくと、第2章以降の計算やポインタ操作が驚くほどスムーズに理解できるようになります。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)