0

「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 つのアクションのいずれかを実行させるため)、その結果、彼らを失格にします。したがって、以前に、彼らが隠れている場所を見つける必要があります:)
4

2 に答える 2

4

そもそもAXが不明で、計算は無意味だけどpush ax;。その後、ループの 2 回目のパスから AX がポップされますが、不明で一定のままであるため、2 つの「メモリ変数」値の差をキャッチする必要があり、それが AX 値になります。そんな感じ:

  mov cx, 0ah;    
     delay:
        nop;
        loop delay;
     l2:
        mov ax, [0A2h];
        mov bx, [0A2h]; 
        sub ax, bx
     jz l2;
        mov [0A2h], ax;
     jmp l2
于 2016-11-05T14:14:29.607 に答える