帮助理解RedCode

时间:2009-01-20 21:02:01

标签: assembly

我正在尝试学习redcode,因为制作机器人看起来很有趣。

简介

对于那些不知道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

我理解这一行的含义。它说,将目标的B场移动到顶点B场的线上,并减小目标B场的值。

第一次执行循环时,第一行将是:

Top dat #0, #12

据我所知,Loop的行意味着: 将指令向前移动12行(填充数据#0,#0)到第833行。

但是当执行此代码时,代码行放在第839行。

有人真正理解发生了什么吗?

1 个答案:

答案 0 :(得分: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  

正如您所看到的,目标位于第7行,因此相对于目标的832行是839行。

希望能为你清除它。