「Code guru - Extreme」という名前のコンペティションに参加します。このコンペティションでは、アセンブリ 8086 に金庫とキーがあります。金庫とキーにはジョイント データ セグメントがあり、金庫を壊すキーを作成する必要があります。安全な例:
L:
mov ax, [1234]
cmp ax, 5678
jne L
金庫を破る鍵の例
L:
mov ax, 5678
mov [1234], ax
jne L
そして今、私はそれを壊すことのできない金庫を持っています
and al, 0FEh
push ax
clc
mul ax
xor ax, dx
or al, 1
loc_10A:
sub [0A2h], ax
pop ax
push ax
jnz loc_10A
この金庫と鍵のシミュレーションは、 Core Wars 8086 エンジン内で行われます。セーフとキーの両方が戦争の生存者である場合のルールは次のとおりです。
ゲームエンジンは毎ターンランダムなアドレスにロードするため、生存者は固定アドレスにロードすることはできません。生成されるプログラムは、EXE ではなく COM である必要があり、8086 命令のみが含まれています。
各生存者は、他の生存者がアクセスできない独自の完全なレジスタ (レジスタ) のセットを受け取ります。さらに、各サバイバーには 2048 バイトの「個人用」スタックがあり、これも他のサバイバーからはアクセスできません。
ゲームの最初のラウンドを実行する前に、ゲーム エンジンはアリーナ内のすべてのバイトを値 0CCh に初期化します (注: このバイト値は「サポートされていない」命令です。詳細は後述します)。次に、エンジンは各サバイバーをアリーナ メモリのランダムな場所にロードします。つまり、サバイバー ファイルの内容をそのままコピーします。2 人のサバイバー間の距離、およびサバイバーとアリーナの端の間の距離は、少なくとも 1024 バイトであることが保証されています。各サバイバーのコードは最大 512 バイトです。
最初のラウンドの前に、ゲーム エンジンは (各生存者の) レジスタを次の値に初期化します。
- BX、CX、DX、SI、DI、BP - リセット。
- フラグ - リセット。
- AX、IP - 最初のサバイバーの位置。ゲーム エンジンによってサバイバーがロードされるアリーナ内のランダム オフセット。
- CS、DS - すべてのサバイバーに共通のアリーナのセグメント。
- ES - 同じグループの生存者が共有するメモリのセグメント (セグメント) (高度なテクニックを参照)。
- SS - 生存者の個人スタックの最初のセクション。
- SP - オフセット サバイバーの個人スタックの開始。
この時点で、ゲームはラウンドで開始され、各ラウンドでゲームエンジンが実行され、各サバイバーの次の命令が実行され、ゲームが終了するまで、つまり 200,000 ラウンド後、または 1 人のサバイバーがアリーナに残るまで続きます。生存者が各ラウンドでプレイする順序は、ゲームの開始時にランダムに決定され、その間は変更されません。
次の場合、サバイバーは失格となります。
- 不正な命令の実行 (例: アセンブリ命令に変換されないバイト 060h)。
- ゲーム エンジンによる「サポートされていない」命令の実行 (例: 「INT 021h」)。ゲーム エンジンは、オペレーティング システムまたはコンピュータ ハードウェアとの直接通信を開始しようとする命令の実行を防ぎます。アリーナの領域内になく、生存者の「個人的な」スタックの領域内にないメモリにアクセスしようとします。
- 他のサバイバーを攻撃するには、コードに関する情報をアリーナ メモリに書き込み (上記の 3 つのアクションのいずれかを実行させるため)、その結果、彼らを失格にします。したがって、以前に、彼らが隠れている場所を見つける必要があります:)