COREWAR

/
Step 18: 間接参照(@ポインタ)の仕組みを知る
🎯0002番地のB値を変更し、@ポインタで遠くの番地へデータを書き込む(0/4)

ミッション一覧 (全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 18 OF 30第3章:ノイマン型の覚醒とデジタル生命の原理⏱ 読了目安:約6分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

間接参照(@ポインタ)の科学——静的なコードが動的な無限の射程を得る仕組み

データ箱に書かれた数値を「本当の宛先住所」として2段階ジャンプする、C言語のポインタやCPUアドレッシングの核心

#Indirect Addressing (@)#Pointers & Dereferencing#Two-Stage Lookup#Dynamic Targeting#Effective Address
🔬Step 18: 間接参照(@ポインタ)の仕組みを知る

第3章の最後に、爆撃機などを作るための最重要テクニック @(間接参照 / ポインタ) を体験しましょう! - $ は「書いてある数字の番地へ直接行く」記号でした。 - @ は 「まず指定したデータ箱を見に行き、その箱のB(右の部屋)に書かれた数字を『本当の宛先メモ』として使ってジャンプする」 という2段階の記号です!

現在 0000 番地は MOV.I $2, @2 となっており、2つ下の 0002 番地を「宛先メモ」として参照しています(紫色の点線矢印に注目!)。

🎯 やってみよう 宛先メモである 0002 番地の B(右の値) を 0 から 3(0002番地から3マス先の 0005番地)または 5 に増やして、紫の矢印が遠くの番地を指すのを確認してから [STEP] を押しましょう!

1. 直接参照($)の限界:なぜ「$」だけでは戦えないのか?

第3章のクライマックスであるStep 18では、プログラミングの世界で最も強力かつ多くの学習者がつまずきやすい概念——『ポインタ(間接参照 / Indirect Addressing:@記号)』を視覚的に体験しました。

まず、なぜこれまでの『$(直接参照)』だけでは不十分なのかを考えてみましょう。 Step 17で書いた『MOV.I $0, $4』は、何回ループして実行しても、永遠に「4つ下の 0004 番地」にしかデータを送ることができません。もし800マス(あるいは8,000マス)の広大なアリーナのどこかに隠れている敵を倒したい場合、『$』しか使えないとしたら、『MOV $0, $1』『MOV $0, $2』『MOV $0, $3』……と800行ものコードを手書きしなければならなくなります!

たった3〜4行の短いプログラムのまま、1周目は 0005 番地、2周目は 0009 番地、3周目は 0013 番地……というように、「同じ1行のMOV命令から、毎回違う番地へデータを飛ばす」にはどうすればよいでしょうか? その答えこそが『@(間接参照ポインタ)』です。

Direct ($2)   : [0000] MOV $2, $2 ──► Writes directly into Cell [0002] (Fixed target)

Indirect (@2) : [0000] MOV $2, @2 ──(Step 1: Look at pointer box [0002])──┐
                [0001] JMP $-1, #0                                        │
                [0002] DAT #0, #3 ◄───────────────────────────────────────┘
                                │
                                └────(Step 2: Read B-value "+3", jump 3 rows from [0002])
                                ▼
                [0005] DAT #0, #3 ◄──💥 Final Landing Address = 0002 + 3 = 0005!

2. 2段階ロケット「@(Bフィールド間接参照)」の仕組み

『$2』と『@2』の違いを、「手紙の配達」に例えてみましょう。 ・直接参照『$2』:「2軒隣の家(0002番地)に手紙を入れろ」という指示です。配達員は 0002 番地のポストに手紙を入れて終わりです。 ・間接参照『@2』:「まず2軒隣の家(0002番地)に行き、そこの掲示板(Bの部屋)に書いてある数字を読め。そして、その家からさらにその数字の分だけ進んだ本当の宛先へ手紙を届けろ!」という2段階(クッション)の指示です!

今回の実験コード『0000: MOV.I $2, @2』と、ポインタ箱『0002: DAT.F #0, #3』の動きを正確に追ってみましょう。 1. 【第1段階(ポインタ箱の参照)】:0000 番地の『@2』を見たCPUは、まず2つ下の『0002 番地』を見に行きます(エディタの紫色の点線矢印の第1ステップ)。 2. 【第2段階(デリファレンス/ジャンプ)】:CPUは 0002 番地のB(右の部屋)に書かれた数字『#3』を読み取ります。そして、そのポインタ箱(0002番地)を基準点として、さらに3マス下へ進んだ『0002 + 3 = 0005 番地』を最終的な着弾地点(実効アドレス)として決定します!

だからこそ、あなたが 0002 番地のデータ箱のB値を『0』から『3』や『5』に変えただけで、0000 番地のMOV命令には一切触れていないのに、紫色の矢印がグンと伸びて遠くの 0005 番地や 0007 番地へデータが飛んでいったのです!

3. C言語のポインタ(*ptr)と「自動カウンター+@ポインタ=爆撃機」の完成

コンピュータ科学やC/C++言語において、このように「データそのものではなく、別のデータの番地(住所)を記憶している変数箱(今回の0002番地)」のことを『ポインタ変数(Pointer Variable)』と呼び、ポインタ箱を経由して本当の宛先へアクセスする操作(@)を『デリファレンス(Dereference:間接参照)』と呼びます。C言語で書く『*ptr = data;』というコードは、ハードウェアの機械語に翻訳されると、まさにあなたが今実行した『MOV data, @ptr』そのものになります。

そしてここで、第2章の最後(Step 13)で作った「自動カウンター(ADDでデータ箱の数字を毎ループ増やす仕組み)」と、今学んだ「@ポインタ(データ箱の数字の番地へデータを飛ばす仕組み)」を頭の中で合体させてみてください! もしループのたびに、ポインタ箱(0002番地)の数字を『ADD』命令で 4, 8, 12, 16... と自動的に増やしながら、『MOV @』でそこへDAT爆弾を投げたらどうなるでしょうか? そう、それこそが次の第4章(Step 19)で登場する伝説の爆撃機『Dwarf(ドワーフ)』なのです!

🔒

🔒 MISSION CLEAR で講義ノートの全編が解放されます

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