問題タブ [corewars]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
570 参照

assembly - RedCode の理解を助ける

ボットを作るのが楽しそうなので、レッドコードを学ぼうとしています。

序章

redcode が何であるかを知らない人のために、ここで簡単に説明します。これは ASM に似た言語ですが、はるかに簡単で無駄がありません。仮想メモリ内の他のプログラムをシャットダウンする必要がある小さなプログラムを作成するために使用されます。(詳細については、こちらを参照してください: http://vyznev.net/corewar/guide.html )

コードの一部を次に示します。

問題

基本的な戦略は、自分自身を別の場所に複製し、プロセスをフォークすることです。私が理解していないのは、このルールです:

このセリフの意味が分かりました。target の B-Field を top の B-Field が指す行に移動し、target の B-Field の値を減らします。

ループが初めて実行されるとき、最初の行は次のようになります。

私の知る限り、Loop のある行は次のことを意味します: 命令を 12 行前 (dat #0、#0 で埋められている) の 833 行に移動します。

しかし、このコードが実行されると、コード行は 839 行目に配置されます。

誰かが本当に何が起こっているのか理解していますか?

0 投票する
1 に答える
198 参照

assembly - コアウォーズのインプリング

Core WarsのImp Ringについて誰か説明してくれませんか?

end上記のコードは、プログラムの開始を示すために使用され、ラベルにコロンがないため、'88 標準のものだと思います。

プログラムは起動ラベルから始まります。このインプ リングがどのように記憶を「クロール」するかを視覚化する助けが必要です。

0 投票する
1 に答える
93 参照

assembly - この RedCode MOV が機能しないのはなぜですか?

それで、私はアセンブリクラスにいて、物事を面白く保つために、隔週で Core Wars のトーナメントを開催しています。IMP をメモリ内のさらに下にコピーし、ジャンプして 2 つの IMP を同時に実行する単純なアプリケーションを作成しようとしています。アイデアは、一度この部分を機能させて、タイトなループに入れて2つ以上にすることです。

これが私のコードです:

ただし、何が起こっているかは最初のMOV/SPLが機能しないため、最初の IMP のみが実行されています。このロジックのどこが間違っているのでしょうか? ADDRマジックナンバーを削除して使用すると機能します。

これは、実行を開始する前のメモリのスクリーン スニペットです。

メモリのスクリーン スニペット

ありがとう。

0 投票する
1 に答える
109 参照

automation - CoreWars の自動化

CoreWars 用のレッドコード ウォリアーを作成するための進化的プログラムを作成する予定です。ただし、生成されたコードを、プログラムを手動で開いて Warriors を挿入せずに実行する方法がまったくわかりません。少なくとも 1 分間に数人の戦士に進化プログラムを実行してもらいたいので、あまり管理者の役割を果たす必要はありません。私は ARES シミュレーターを使用していますが、スクリプトを使用して戦士を実行するという私の研究に関しては、何も見つかりませんでした。

私は本当に次のようなものを探しています:

SomeSimulator.exe --warrior1 megalordthedestroyer.red --warrior2 tinathebabybunny.red

0 投票する
2 に答える
1896 参照

assembly - 組み立て - 安全な競争

「Code guru - Extreme」という名前のコンペティションに参加します。このコンペティションでは、アセンブリ 8086 に金庫とキーがあります。金庫とキーにはジョイント データ セグメントがあり、金庫を壊すキーを作成する必要があります。安全な例:

金庫を破る鍵の例

そして今、私はそれを壊すことのできない金庫を持っています


この金庫のシミュレーションは、 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 つのアクションのいずれかを実行させるため)、その結果、彼らを失格にします。したがって、以前に、彼らが隠れている場所を見つける必要があります:)
0 投票する
2 に答える
815 参照

assembly - Core Wars 8086 セーフ チャレンジ (セーフはメモリ アドレスへの追加を使用)

私は金庫大会をやっていて、この金庫を手に入れました:

私の理解では、 cx はループの最後で 0 になり、次の反復で FFFF に変わります。また、0xCCh がプログラムを停止させる不正な命令であることもわかっています。どうすればこの金庫を破ることができますか?

**編集: ここでの目標は、この無限ループを止めることです。ループには停止期間がなく、リバース エンジニアリングを使用してループを停止させる必要があります。例: これは単純な金庫です。

これは、リバース エンジニアリングを使用して記述されたキーです。


この金庫のシミュレーションは、 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 ラウンド後、または単一の生存者がアリーナに残るとき。生存者が各ラウンドでプレイする順序は、ゲームの開始時にランダムに決定され、その間は変更されません。

次の場合、サバイバーは失格となります。

  • 不正な命令の実行 (例: アセンブリ命令に変換されないバイト 060h)。
  • ゲーム エンジンによる「サポートされていない」命令の実行 (例: 「INT 021h」)。ゲーム エンジンは、オペレーティング システムまたはコンピュータ ハードウェアとの直接通信を開始しようとする命令の実行を防ぎます。アリーナの領域内になく、生存者の「個人的な」スタックの領域内にないメモリにアクセスしようとします。
  • 他のサバイバーを攻撃するには、コードに関する情報をアリーナ メモリに書き込み (上記の 3 つのアクションのいずれかを実行させるため)、その結果、彼らを失格にします。したがって、以前に、彼らが隠れている場所を見つける必要があります:)