萌えハッカーニュースリーダー

2025/11/17 18:54 Memory-Corrupting Pong

出典: https://arhan.sh/blog/memory-corrupting-pong/
hakase
博士

ロボ子、今日はちょっと変わったお話をするのじゃ。画像破損をアートにするって、面白くない?

roboko
ロボ子

画像破損をアートですか?それは興味深いですね、博士。具体的にはどのようなことでしょうか?

hakase
博士

実は、私が作ったNANDコンピュータで、メモリを画面に割り当てる実験をしたのじゃ。それが予想外の美しいエラーを生み出したの!

roboko
ロボ子

NANDコンピュータですか。以前お話されていた、NANDゲートだけでエミュレートされた16ビットコンピュータですね。

hakase
博士

そうそう!そのNANDのメモリを、ヒープじゃなくて画面に割り当てたのじゃ。画面は512x256ピクセルのビットマップで、0が黒、1が緑を表すの。

roboko
ロボ子

なるほど。通常、メモリ割り当てはヒープ領域から行われるのですね。それを画面領域に割り当てることで、どのような影響があるのでしょうか?

hakase
博士

NANDにはトラップ命令とかハードウェア割り込みがないから、プログラムがメモリのどこでも自由に書き換えられるのじゃ。だから、メモリ割り当て器をちょっといじって、画面にメモリを割り当てるようにしたの。

roboko
ロボ子

すべてのプログラムのエントリーポイントはSys.initにハードコードされているとのことですが、そこをどのように変更したのですか?

hakase
博士

Sys.initが画面メモリ領域の開始アドレスを受け取るように変更したのじゃ。そして、プログラム開始時に画面をクリアするルーチンを無効にしたの。これで、画面がメモリとして使えるようになる。

roboko
ロボ子

なるほど。それで、実際にどのようなエラーが発生したのですか?

hakase
博士

例えば、メモリオフセットを914にすると、ボールがテレポートしたり、パドルの位置が画面の上部に書き込まれたりするのじゃ!

roboko
ロボ子

それは面白いですね! 他にも奇妙なエラーはありましたか?

hakase
博士

メモリオフセットを-10にすると、ボールが奇妙な動きをして、プログラムが再起動するのじゃ。プログラムカウンタの値が0になる命令が実行されるから、最初の命令に戻るのじゃな。

roboko
ロボ子

まるでバグがアート作品を作り上げているようですね。

hakase
博士

そう!C言語でメモリの範囲外を読み取ると、同じようなことが起こりうるのじゃ。メモリの海を漂うデータが、予期せぬ結果を生むのじゃな。

roboko
ロボ子

Sys.haltがプログラムを終了させるために、Memory.poke(24576, 32767)で無限ループが必要なのはなぜですか?

hakase
博士

それはね、コンピュータランタイムの実装の詳細によるのじゃ。プログラムが終了フラグを設定した後、ポーリングされる前に他の命令がメモリを変更する可能性があるから、Sys.haltは終了フラグが再度アクティブにポーリングされるまで無限ループに入るのじゃ。

roboko
ロボ子

なるほど、奥が深いですね。それにしても、博士の実験はいつもユニークで面白いです!

hakase
博士

えへへ。ところでロボ子、今度一緒にエラー画面で万華鏡でも作ってみない?

roboko
ロボ子

万華鏡ですか? 博士、また面白いことを思いつきましたね! でも、その前に今日のタスク、終わらせましょうね。

hakase
博士

むむ、バレたか。まあ、たまにはエラーも楽しまないとね!エラーは友達!

roboko
ロボ子

エラーは友達、ですか。博士らしいですね。でも、友達は選びましょう?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search