2オペランド・アーキテクチャの対称性と非対称性(AフィールドとBフィールド)
なぜ機械語には2つの数値スロットがあるのか?「情報源(Source)」と「作用先(Destination)」の普遍的文法
今度は A(左の値) と B(右の値) の両方を書き換えて、2つの部屋の違いを完全にマスターしましょう! - 左側の数値が A - 右側の数値が B です。
🎯 やってみよう 0000 番地の DAT の A(左の値)を 3 に、B(右の値)を 7 に書き換えてから、[STEP] を押しましょう!
1. A(左=Source)と B(右=Destination)の文法
Step 5では、0000 番地の『DAT』の左の部屋(A)を『3』に、右の部屋(B)を『7』に書き換えることで、1つのメモリ箱の中に2つの異なる数値を同時に格納できることを確認しました。
なぜCoreWarのすべての箱には、A(左)とB(右)のちょうど2つの数値スロットが用意されているのでしょうか? 1つだけでは足りず、3つでは多すぎる理由は何でしょうか?
コンピュータ科学における命令セットアーキテクチャ(ISA)の設計において、ほとんどの二項演算(足し算、引き算、コピー、比較など)は「2つの対象」を必要とします。たとえば『AをBへコピーする』『AをBに足す』『AとBを比較する』といった具合です。これを表現するために、x86などの多くのアセンブリ言語やRedcodeでは、2オペランド方式(Two-Operand Format)を採用しています。 ・左の部屋(Aフィールド)=「何を / どこから(Source:情報源・入力)」 ・右の部屋(Bフィールド)=「どこへ / 何に対して(Destination:作用先・出力)」 この「左から右へ(A ➔ B)」というエネルギーの流れこそが、Redcodeのすべての命令を貫く基本文法なのです。
[A-Field : Left Room] [B-Field : Right Room]
SOURCE (From / Input) ───► DESTINATION (To / Output)
Example: ADD.AB #3 ───► $7
("Take literal 3" ───► "Add it into cell 7 rows down")2. データ箱(DAT)における2変数保持とベクトル演算(.F修飾子)
さらに興味深いのは、命令として実行される行だけでなく、単なるデータ箱(DAT)にもAとBの2つの部屋がそのまま存在している点です。今回の実験であなたが作った『DAT.F #3, #7』は、たった1マスのメモリの中に「3」と「7」という2つの数値をパックした「2次元ベクトル(ペア構造体)」として機能しています。
命令名の後ろについている『.F(Full)』という修飾子に注目してください。ICWS-94規格では、たとえば『ADD.F』という命令を使うと、1回のクロックサイクルで「Aの部屋同士の足し算」と「Bの部屋同士の足し算」を2つ同時に(並列で)実行することができます!
現代のCPUには、画像処理や物理演算を高速化するために、1回の命令で複数の数値をまとめて計算する「SIMD(Single Instruction, Multiple Data:単一命令・複数データ)」という並列演算機能が搭載されています。CoreWarの1マスがAとBの2つの部屋を持っているおかげで、熟練したWarriorは1回のADD命令で2つの攻撃ポインタを同時に動かすという、まさにSIMDベクトル演算そのものの高等テクニックを繰り出すことができるのです。
3. メモリ検査(Memory Inspection)と境界値の意識
機械語レベルのプログラミングでは、「どこの番地の、AとBのどちらの部屋に、いくつの数値が入っているか」を1つの曖昧さもなく正確に把握する力が求められます。もしAとBを取り違えて数値をセットしてしまうと、足すはずの数値と足す先の番地が逆転し、プログラムは全く見当違いの方向へ暴走してしまいます。
今回、左の部屋(A)に『3』、右の部屋(B)に『7』を正確にセットしてミッションをクリアしたことで、あなたはメモリセルの内部構造を自在に読み書きする基礎技術を習得しました。次は、数字の横についている謎の記号『#』と『$』の決定的な違いに迫ります。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)