2

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

序章

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

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

;redcode
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
Top dat #0, #0
Start   mov #12,    Top
Loop    mov @Top,   <Target
    djn Loop,   Top
    spl @Target,0
Spacer  equ 653
    add #Spacer,Target
    jmz Start,  Top
Target  dat #0, #833
    end Start

問題

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

Loop    mov @Top,   <Target

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

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

Top dat #0, #12

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

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

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

4

1 に答える 1

3

さて、それはかなりの読書を要しましたが、これがあなたの答えです:

最初の命令は、ご想像のとおり、Top を DAT #0、#12 にします。簡単ですが、次の命令はもっとトリッキーです。まず、Target の B 値を減らします (832 にします)。次に、 Top の命令を Target から832 行先の場所にコピーします。それが重要です。間接アドレス指定モードは、宛先がオフセット用に読み取られた B 値に関連していることを意味します。コンパイル後のコードを見てください。行番号が前に付いています。

0000 Top    DAT.F  #0        #0       
0001 Start  MOV.AB #12       $-1      
0002 Loop   MOV.I  @-2       <5       
0003        DJN.B  $-1       $-3      
0004        SPL.B  @3        $0       
0005        ADD.AB #653      $2       
0006        JMZ.B  $-5       $-6      
0007 Target DAT.F  #0        #833  

ご覧のとおり、Target は 7 行目にあるため、Target に対して 832 行進んだのは 839 行目です。

それがあなたのためにそれを片付けることを願っています。

于 2009-01-20T21:54:28.153 に答える