COREWAR

/
Step 10: 引き算の命令「SUB」を使ってみよう
🎯SUB命令を使って 0001番地のB値を 7 にする(0/7)

ミッション一覧 (全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 10 OF 30第2章:基本命令と自律プログラムの構築⏱ 読了目安:約5分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

減算命令(SUB)と有限リング(環状メモリ)におけるモジュラ算術

Opcode(命令の種類)を切り替える意味と、0より小さくなった数値が円環空間でどう振る舞うか

#SUB (Subtract)#Opcode Selection#ALU Control Signal#Modular Arithmetic#Circular Core
🔬Step 10: 引き算の命令「SUB」を使ってみよう

命令(Opcode)の部屋をクリックすると、別の命令に切り替えることができます。 - ADD: 足し算(Add) - SUB: 引き算(Subtract)

現在、0001 番地のデータ箱には 10 が入っており、0000 番地は ADD.AB #3, $1(10に3を足す)になっています。

🎯 やってみよう 0000 番地の 命令プルダウン(ADD) をクリックして SUB(引き算) に変更し、[STEP] を押して 0001 番地のB値を 10 - 3 = 7 にしましょう!

1. Opcode(命令コード)はALUへの「機能切り替えスイッチ」

Step 10では、初めて一番左の部屋である「命令(Opcode)」のプルダウンを操作し、『ADD(足し算)』から『SUB(引き算)』へと切り替えて、0001 番地のデータ『10』から『3』を引いて『7』にする実験を行いました。

『ADD.AB #3, $1』と『SUB.AB #3, $1』を見比べてみてください。Aフィールド(#3)も、Bフィールド($1)も、修飾子(.AB)も全く同じです。変わったのは先頭の『ADD』か『SUB』かという命令名(Opcode)だけです。

ハードウェアの視点で見ると、どちらの命令も「0000番地のA値(3)と、0001番地のB値(10)をALU(算術論理演算装置)へ運び、計算結果を0001番地のBへ書き戻す」というデータの通り道(データパス)は100%共通しています。Opcodeの役割とは、ALUに対して「今回は足し算回路(+)ではなく、引き算回路(-)のスイッチを入れて計算せよ!」という制御信号(Control Signal)を送ることに他なりません。

Inputs: A = 3, Target B = 10
  ├─ If Opcode == ADD ──► ALU computes 10 + 3 = 13
  └─ If Opcode == SUB ──► ALU computes 10 - 3 = 7  ──► Write 7 to [0001].B

2. もし「0」から「1」を引いたらどうなる?(モジュラ算術の秘密)

今回は「10 - 3 = 7」という普通の正の引き算でしたが、ここでコンピュータ科学における極めて重要な問いを考えてみましょう。もしデータ箱の数値が『0』のときに、『SUB.AB #1, $1』を実行して 0 から 1 を引いたら、箱の中の数字はどうなるでしょうか?

普通の算数では「-1」になりますし、エディタの表示上も分かりやすく『-1』と表示されることがあります。しかし、CoreWarの仮想計算機(MARS)の内部ルール(ICWS-94規格)では、メモリ空間は「0番地から799番地(Laboratoryでは7999番地)までがぐるりと輪っかのようにつながった円環(リング)構造」をしています。

時計の文字盤を思い浮かべてください。12時間計の時計で「0時」から「1時間」を引き算(逆回転)すると、「-1時」ではなく「11時」になりますね。これと全く同じように、800マスのCoreWar宇宙では、すべての数値は「800で割った余り(Modulo 800)」として扱われます。したがって、内部的には『0 - 1 = 799(1つ後ろ=1つ上の番地)』と完全に等価になります。これを数学で「剰余演算(Modular Arithmetic)」と呼びます。

3. 2の補数と「引き算=逆方向への足し算」の統一性

この「円環(リング)の上では、1を引くこと(-1)と、799を足すこと(+799)が同じ場所に辿り着く」という性質は、実はCoreWarだけでなく、現代のすべてのCPUが採用している「2の補数(Two's Complement)」という負数の表現方式そのものです。

現代の64ビットCPUや32ビットCPUの内部には、実は本来の意味での「引き算専用の巨大回路」は存在しません。CPUは引き算(A - B)を行うとき、Bのビットを反転させて1を足した「補数(-B)」を作り、それを加算器(Adder)に通すことで、引き算を「足し算」として処理しています。

CoreWarにおいて『SUB』命令は、数値を減らすカウントダウンタイマーを作るだけでなく、「自分の番地よりも上(マイナス方向)に向かって爆弾を投げるポインタ」を動かすためにも大活躍します。

🔒

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

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