【问题标题】:Helping understanding RedCode帮助理解 RedCode
【发布时间】:2009-01-20 21:02:00
【问题描述】:

我正在努力学习 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-Field移动到顶点B-Field所在的线,并减小目标B-Field的值。

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

Top dat #0, #12

据我所知,带有 Loop 的行的意思是: 将指令前移 12 行(用 dat #0、#0 填充)到第 833 行。

但是当这段代码执行时,代码行放在了第839行。

有人了解真正发生的事情吗?

【问题讨论】:

    标签: assembly corewars redcode


    【解决方案1】:

    好的,这需要阅读大量内容,但这是您的答案:

    您猜对了,第一条指令使 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 行。

    希望能为您解决问题。

    【讨论】:

    • 感谢您的解释。其他人已经帮助了我,但无论如何,现在很清楚了。
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2018-12-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多