即値(#)と相対アドレス($)——位置独立コード(PIC)の誕生
なぜ「0002番地」ではなく「ここから2つ下($2)」と書くのか? メモリ上のどこに配置されても動くプログラムの秘密
数字のすぐ左にある記号(# や $)に注目してください!これは アドレッシングモード(指定方法) と呼ばれます。 - #(数値そのもの / Immediate): #9 なら「数字の 9」という意味です。 - $(何マス先の番地か / Direct): $1 なら「ここから 1つ下の箱」という場所(番地)を指します。
現在 0000 番地には MOV.AB #9, $1(数字の 9 を、$1=1つ下の箱へ送る)と書かれており、緑色の矢印が 0001 番地を指しています。
🎯 やってみよう 0000 番地の B(右の値) を $1 から $2(2つ下の箱=0002番地) に変えて矢印が 0002 番地へ伸びるのを確認し、[STEP] を押して 0002 番地のB値を 9 にしましょう!
1. 「数字そのもの(#)」と「箱の場所($)」の決定的な違い
第1章の締めくくりとなるStep 6では、コンピュータ科学において初心者が最初にぶつかり、かつ乗り越えると視界が一気に開ける最重要概念——「アドレッシングモード(Addressing Mode:番地指定方式)」を体験しました。
同じ『2』という数字であっても、左に『#』がつくか『$』がつくかで、CPUにとっての意味は天と地ほど異なります。 ・『#2(Immediate / 即値モード)』:「数字の 2 そのもの」を意味します。どこかの箱を見に行くのではなく、命令の中に書かれた『2』という数値をそのまま材料として使います。 ・『$2(Direct / 直接相対アドレスモード)』:「今実行しているこの行から、2つ下にある箱(番地)」を意味します。数字の2を計算に使うのではなく、『2つ先の箱を開けろ』という「場所の指定(住所)」として使われます。
今回の実験コード『MOV.AB #9, $2』を日本語に翻訳すると、「数字そのものである『9(#9)』を、ここから2つ下の箱($2=0002番地)へ送り込め!」という意味になります。エディタから伸びる緑色の予測矢印が、Bの値を『$1』から『$2』に変えた瞬間に 0001 番地から 0002 番地へと伸びたのは、まさに『$』が「場所を指し示す矢印」だからです。
[0000] MOV.AB #9, $2
│ └──► $2 (Direct Relative Address): "Target the box 2 rows down (0002)"
└───────► #9 (Immediate Literal Value): "Send the literal number 9"2. なぜ絶対番地ではなく「相対アドレス($)」なのか?
ここで鋭い人はこう疑問に思うはずです。「0002番地に送りたいなら、わざわざ『ここから2つ下($2)』なんて言わずに、最初から『0002番地』と絶対番地で書けばいいじゃないか!」と。
もしあなたが1人きりでメモリを使うなら、絶対番地でも困りません。しかし、実際のバトル(Arena)や現実のOS(Windows、macOS、Linux)を考えてみてください。バトルが始まるとき、あなたのWarriorは8,000マスの広大なメモリの「ランダムな番地(たとえば 3412 番地など)」に配置されます。さらに、自分自身のコードを別の場所(たとえば 5000 番地)へ丸ごとコピーして引っ越すこともあります。
もしプログラムの中に「絶対番地 0002 にデータを送れ」と書いてあったらどうなるでしょうか? 3412 番地に配置されたあなたのプログラムは、すぐ2つ下の自分のデータ箱(3414番地)ではなく、はるか遠く離れた 0002 番地にデータを誤爆して自滅してしまいます!
それに対して、「今いる場所から2つ下の箱($2)」という『プログラムカウンタ相対アドレッシング(PC-Relative Addressing)』で書かれていれば、プログラムが 0000 番地に置かれようが、3412 番地に置かれようが、常に『3412 + 2 = 3414番地(自分のすぐ2つ下の箱)』を正確に指し示すことができます。
3. 現代OSのセキュリティ技術「PIC」と「ASLR」への直結
この「メモリのどこに配置されても、書き換えなしでそのまま正しく動くコード」のことを、コンピュータ科学では『位置独立コード(PIC: Position-Independent Code)』と呼びます。
実は、あなたが普段使っているスマートフォンやPCで動くほぼすべてのアプリや共有ライブラリ(.dll / .so / .dylib)は、このCoreWarと全く同じ「PC相対アドレッシング(PIC)」でコンパイルされています。なぜなら、現代のOSはハッカーの攻撃を防ぐために、アプリを起動するたびにメモリ上の配置番地をランダムにシャッフルする『ASLR(Address Space Layout Randomization:アドレス空間配置のランダム化)』という防衛技術を標準で行っているからです。
CoreWarが1984年の誕生当初から「絶対番地を廃止し、すべてのアドレスを相対番地($0, $1, $2...)にする」という仕様を採用していたことは、移動し増殖するデジタル生命のための必然であると同時に、現代のセキュアなOSアーキテクチャを先取りした極めて先見的な設計だったのです。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)