無条件分岐命令「JMP」とループ構造——空間の有限性を時間の無限性へ変える
プログラムカウンタ(PC)の流れを書き換える制御転送命令と、チューリング完全への第一歩
これまでのプログラムは、数行進むと下の DAT にぶつかって停止してしまいました。 プログラムが死なずに動き続けるには、JMP(ジャンプ)命令 で実行ポインタを上の行へ戻して ループ(繰り返し) を作ります!
- JMP の飛び先は A(左の番地) で指定します。 - マイナスの数字($-1)を指定すると、「1つ上の行(0000番地)へ戻る」という意味になります!
🎯 やってみよう 2行目(0001 番地)の JMP の A(左の番地) を $0 から $-1(- ボタンを1回押す)に変えて、[PLAY](または [STEP] 連打) で Cycle 10 以上 までループさせてみましょう!
1. 自然落下するプログラムカウンタに逆らう「JMP」
Step 1からStep 11までの実験では、プログラムカウンタ(PC:光る実行行)は常に上から下へ(0000 ➔ 0001 ➔ 0002...)と重力に従うように1行ずつ落ちていくだけでした。そのため、数行の命令を実行し終えると、必ず下にある『DAT』にぶつかってプロセスが死んでしまいました。
もしプログラムが上から下へ1回通るだけで終わってしまうなら、100万回の計算をするためには100万行のコードを書かなければなりません。この限界を打ち破り、わずか数行のコードに「永遠の命」を与えたのが、今回体験した無条件ジャンプ命令『JMP(Jump)』です!
『ADD』や『MOV』が「メモリ箱の中のデータ」を書き換える命令だったのに対し、『JMP』はメモリ箱には一切手を触れず、なんと「CPU自身のプログラムカウンタ(PC:次に実行する番地)を直接書き換える」という特別な命令(制御フロー命令)なのです。
[0000] ADD.AB #1, $2 ◄──┐ (Cycle 1, 3, 5, 7, 9...)
│ │
▼ │JMP.A $-1 (Rewrites PC = 0001 - 1 = 0000!)
[0001] JMP.A $-1, #0 ───┘ (Cycle 2, 4, 6, 8, 10...)
[0002] DAT.F #0, #0 (Never stepped on! Safe below the loop)2. 負のオフセット($-1)が創り出す「ループ(反復構造)」
今回のミッションでは、2行目(0001 番地)にある『JMP.A $0, #0』の左の値(Aフィールド)を『$-1』に変更しました。 ・もし『JMP.A $0』のままだと、飛び先は「0001 + 0 = 0001番地(自分自身の行)」になるため、その場で足踏みするだけの無意味なループになります。 ・これを『JMP.A $-1』に変えると、飛び先は「0001 - 1 = 0000番地(1つ上の行)」になります!
その結果、何が起きたでしょうか? 1サイクル目:0000 番地の『ADD.AB #1, $2』を実行し、PCが 0001 番地へ進む。 2サイクル目:0001 番地の『JMP.A $-1, #0』を実行し、PCが 0000 番地へと巻き戻される! 3サイクル目:再び 0000 番地の『ADD.AB #1, $2』が実行される!
空間的にはたった2行しかないプログラムが、時間を巻き戻すループ(反復構造)を手に入れたことで、0002 番地のDATに落ちることなく、Cycle 10、Cycle 100、Cycle 1000 へと半永久的に生き続けながら足し算を繰り返す存在へと進化したのです。
3. 構造化定理と「生きたプロセス」の条件
1966年、計算機科学者のコラド・ベーム(Corrado Böhm)とジュゼッペ・ヤコピーニ(Giuseppe Jacopini)は、「どんなに複雑なコンピュータ・プログラムも、①順次進行(上から下へ進む)、②反復(ループ)、③条件分岐のたった3つの制御構造だけで書ける」という歴史的な定理(構造化定理)を証明しました。
また、通常のビジネスアプリでは「終わらないループ(無限ループ)」はバグとして嫌われますが、OS(オペレーティングシステム)の心臓部やゲームのメインループ、そしてCoreWarのデジタル生命においては話が全く逆です。彼らにとって「ループが止まること」はすなわち「死(システム停止)」を意味し、JMPによって永遠に回り続けるループこそが、生命の「心臓の鼓動(ハートビート)」そのものなのです。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)