COREWAR

/
Step 6: 「数値(#)」と「番地($)」の記号の違い
🎯0002番地のB値を 9 にする(0/9)

ミッション一覧 (全30ステップ)

第1章:画面とメモリの基本 (1-6)
BASIC★☆☆
Step 1: 時間を進める「STEP」ボタン
🔒
BASIC★☆☆
Step 2: プロセスの停止と「RESET」での復旧
🔒
BASIC★☆☆
Step 3: 「編集できる状態」と「実行中の状態」EDIT
🔒
BASIC★☆☆
Step 4: メモリの箱の3つの部屋(右の部屋 B を変える)EDIT
🔒
BASIC★☆☆
Step 5: 左の部屋(A)と右の部屋(B)を書き換えるEDIT
🔒
BASIC★☆☆
Step 6: 「数値(#)」と「番地($)」の記号の違いEDIT
第2章:代表的な命令とループ (7-13)
🔒
ARITHMETIC★☆☆
Step 7: 足し算の命令「ADD」の観察
🔒
ARITHMETIC★☆☆
Step 8: 足す「数値(A)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 9: 足す「相手の場所(B)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 10: 引き算の命令「SUB」を使ってみようEDIT
🔒
BASIC★☆☆
Step 11: 箱を丸ごとコピーする命令「MOV」EDIT
🔒
CONTROL★☆☆
Step 12: 時間を巻き戻すジャンプ命令「JMP」EDIT
🔒
CONTROL★☆☆
Step 13: 簡単なプログラムを作ろう(自動カウンター)EDIT
第3章:ノイマン型とデジタル生命 (14-18)
🔒
BASIC★☆☆
Step 14: なぜ「DAT」が爆弾になるのか?EDIT
🔒
BASIC★☆☆
Step 15: 自分自身の命令をコピーする(コード=データ)EDIT
🔒
BASIC★☆☆
Step 16: お手本観察:最古の生命体「Imp」をSTEP実行する
🔒
BASIC★☆☆
Step 17: Impの簡単な変更(コピー先の観察と実験)EDIT
🔒
ARITHMETIC★★☆
Step 18: 間接参照(@ポインタ)の仕組みを知るEDIT
第4章:伝統的アルゴリズム (19-24)
🔒
STRATEGY★★☆
Step 19: お手本観察:爆撃機「Dwarf」をSTEP実行で解剖する
🔒
STRATEGY★★☆
Step 20: Dwarfの簡単な変更(爆弾の間隔を変える)EDIT
🔒
STRATEGY★★☆
Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよEDIT
🔒
CONTROL★★☆
Step 22: お手本観察:分裂命令「SPL」と増殖の仕組み
🔒
CONTROL★★☆
Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探すEDIT
🔒
STRATEGY★★☆
Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろEDIT
第5章:実戦改造と総合演習 (25-30)
🔒
STRATEGY★★☆
Step 25: 【Stone(石)】高速爆撃機の観察とステップ幅の改造EDIT
🔒
STRATEGY★★☆
Step 26: 【Paper(紙)】自己複製スウォーム「Mice」を観察する
🔒
STRATEGY★★★
Step 27: 【Paperの改造】クローン投下距離を変更して増殖せよEDIT
🔒
STRATEGY★★☆
Step 28: 【Scissors(鋏)】索敵スキャナーの観察とスキャン間隔の改造EDIT
🔒
STRATEGY★★★
Step 29: 【Trap(罠)】敵の魂を誘拐する「Vampire」の観察と改造EDIT
🔒
STRATEGY★★★
Step 30: 卒業試験:愛機のチューニングと総合バトルEDIT
🟢 編集モード(セルをクリックして変更できます)
[番地][命令 (Opcode)][A (左の値)][B (右の値)]
📦 データ領域 / 爆弾 (DAT)
0000
▼MOV
#
$
👈 ここを変更
0001
▼MOV
<
<
0002
↺JMN
$
$
0003
❖SPL
@
#
0004
+ADD
#
$
0005
↺JMP
$
$
0006
■DAT
$0
$0
++ 命令を追加
0007
■DAT
$0
$0
0008
■DAT
$0
$0
0009
■DAT
$0
$0
0010
■DAT
$0
$0
0011
■DAT
$0
$0
0012
■DAT
$0
$0
0013
■DAT
$0
$0
0014
■DAT
$0
$0
0015
■DAT
$0
$0
0016
■DAT
$0
$0
0017
■DAT
$0
$0
0018
■DAT
$0
$0
0019
■DAT
$0
$0
0020
■DAT
$0
$0
0021
■DAT
$0
$0
0022
■DAT
$0
$0
0023
■DAT
$0
$0
0024
■DAT
$0
$0
0025
■DAT
$0
$0
0026
■DAT
$0
$0
0027
■DAT
$0
$0
🏟️ARENA (20 ROWS)SCOPE: 0000 - 0019
[メモリ空間 800番地 (20行 × 40列)]左のエディタと1対1で同期
TASKS: 0
CYC: 0
📖 講義ノート // STEP 06 OF 30第1章:画面操作とメモリの基本構造⏱ 読了目安:約6分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

即値(#)と相対アドレス($)——位置独立コード(PIC)の誕生

なぜ「0002番地」ではなく「ここから2つ下($2)」と書くのか? メモリ上のどこに配置されても動くプログラムの秘密

#Addressing Modes#Immediate (#)#PC-Relative Direct ($)#Position-Independent Code (PIC)#ASLR
🔬Step 6: 「数値(#)」と「番地($)」の記号の違い

数字のすぐ左にある記号(# や $)に注目してください!これは アドレッシングモード(指定方法) と呼ばれます。 - #(数値そのもの / 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 で講義ノートの全編が解放されます

上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)