アトミックなポインタ減算(< プリデクリメント)と対Imp防衛工学「Imp-Gate」
なぜ1マスずつ迫り来る不死身のImpを「<」記号1つで粉砕できるのか? 1サイクル内でポインタ更新と書き込みを行う複合アドレッシングの威力
敵として1マスずつ前進してくる 「Imp(MOV $0, $1)」 が現れました! 4マスおきに爆弾を投げる普通のDwarfでは、1マスのImpに隙間をすり抜けられてしまいます。
Impを確実に仕留めるには、アドレッシングモードの <(プリデクリメント:参照先のB値を -1 減らしながらアクセスする記号) を使います! 0000 番地の MOV.I $2, $2 のBモードを $ から <(MOV.I $2, <2)に変えると、0002 番地のポインタ(初期値 #415)を1ずつ減らしながら、前進してくるImpの目の前に隙間なく DAT の壁を敷き詰めてすり潰すことができます!
🎯 やってみよう 0000 番地の Bモード(右側の $ 記号) をプルダウンで < に変更し、[PLAY] を押して敵のImpを撃破しましょう!
1. 爆撃機Dwarfの天敵:隙間をすり抜ける1マスの「Imp」
第4章の締めくくりとなるStep 24では、0400 番地から1サイクルに1マスずつこちらへ向かって前進してくる『Imp(MOV.I $0, $1)』を迎え撃ち、アドレッシングモードの記号を『$』から『<(プリデクリメント)』に変えることで撃破する防衛実験を行いました。
まず、なぜ普通のDwarf(4マスおきに爆弾を投げる爆撃機)ではImpを倒すのが難しいのかを考えてみましょう。 Impの身体はたった1マスしかなく、しかも毎ターン1マスずつ下(大きい番地)へと移動し続けています。4マスおきにしか爆弾を落とさないDwarfでは、75%の確率でImpの頭上を爆弾が飛び越してしまいます。さらに悪いことに、たとえImpがすでに通り過ぎた「後ろの足跡(過去のMOV命令)」にDAT爆弾を当てても、Impの実行ポインタ(魂)はすでに先頭へ進んでいるため、痛くも痒くもないのです!
前進し続けるImpを確実に殺す唯一の方法は、「Impの実行ポインタが【これから足を踏み入れようとしているすぐ目の前の番地】に、隙間なくDAT爆弾を叩き込むこと」です。
Advancing Imp : [0400] ──► [0401] ──► [0402] ──► [0403] (Moves +1 per turn)
"<" Imp-Gate : [0415] ◄── [0416] ◄── [0417] ◄── [0418] (Sweeps -1 per loop with zero gaps!)
💥 Head-on Collision Guaranteed!2. 1サイクルで2つの仕事をする「<(B間接プリデクリメント)」
もし普通の『ADD』や『SUB』を使って隙間なく1マスずつ逆方向に爆弾を投げようとすると、「①SUBでポインタを1減らす ➔ ②MOVで爆弾を投げる ➔ ③JMPで戻る」という3行(3サイクル)がかかります。 しかし、アドレッシングモードの『<(Pre-Decrement Indirect:前置デクリメント間接参照)』を使うと、なんと「ポインタを1減らす計算」と「その番地へのデータの書き込み」を、ADD/SUB命令なしで【たった1サイクル(MOV命令1行の中)】で同時にやってのけるのです!
『0000: MOV.I $2, <2』が実行される瞬間のCPU内部の動き(アトミック操作)を見てみましょう。 1. CPUは2つ下のポインタ箱(0002番地:『DAT.F #0, #415』)を見に行きます。 2. 『<』記号のルールに従い、まずそのポインタ箱のB値を自動的に「-1(デクリメント)」して『415 ➔ 414』に書き換えます! 3. その直後(同じ1サイクルの内部で!)、減らしたばかりの新しいポインタ値(0002 + 414 = 0416番地)へ向けて、0002番地のDAT爆弾を投下します!
その結果、『ADD』命令が1行もないたった2行のループ(MOVとJMPだけ)で、2サイクルごとに 0416 ➔ 0415 ➔ 0414 ➔ 0413 番地へと、1マスの隙間も開けずに後ろ向き(逆方向)へDAT爆弾のローラーを転がすことができるのです。
3. 相対速度の物理学と「Imp-Gate(インプ関門)」の完成
なぜポインタを「増やす(+1)」のではなく、「減らす(-1:逆向きに走らせる)」のがこれほど有効なのでしょうか? 幾何学と相対速度で考えてみましょう。敵のImpは 0400 番地から 0401, 0402, 0403... と「下向き(プラス方向)」へ歩いてきます。もしこちらの爆弾もプラス方向へ1マスずつ落としていくと、敵の後ろを追いかけっこすることになりかねません。 しかし、敵の前方(0416番地)から『<(マイナス方向)』に向かって逆向きに爆弾を敷き詰めていけば、前進してくるImpと後退していく爆弾の壁が必ず正面衝突(Head-on Collision)を起こし、Impは絶対にすり抜けることができません!
さらにCoreWarでは、1箇所の番地に対して『SPL $0』や『JMP $-1』を回しながら『<』で絶え間なく値を引き算し続けることで、そこを通過しようとするすべてのImpを自動的に処刑する防衛施設『Imp-Gate(インプ・ゲート/インプ関門)』を作ることができます。C言語の『*(--ptr)』に相当するこの『<』記号は、次の第5章で登場する自己複製体Paperの高速コピーエンジンとしても大活躍します。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)