【问题标题】:Why isn't this RedCode MOV working?为什么这个 RedCode MOV 不起作用?
【发布时间】:2015-04-25 04:10:05
【问题描述】:

所以,我在上组装课,为了让事情变得有趣,我们每两周举办一次 Core Wars 锦标赛。我正在尝试制作一个简单的应用程序,将 IMP 复制到内存中更远的位置,然后跳回并同时让两个 IMP 运行。我的想法是,一旦我完成了这部分工作,就可以将其放入一个紧密的循环中并制作两个以上。

这是我的代码:

JMP START        ; Jump to the starting point

ADDR DAT #1, #0  ; Remember the last address we dropped at
MOVE MOV 0, 1    ; The imp to be copied

START            ; Starting point
ADD #-1, ADDR    ; Take 1 off the address
ADD #80, ADDR    ; Move 80 forward
ADD #1, ADDR     ; Make that 81

MOV MOVE, ADDR   ; Move the imp to the ADDR
SPL ADDR         ; Split a new processes at the ADDR

JMP MOVE

但是,发生的情况是第一个 MOV/SPL 不起作用,因此只有第一个 IMP 正在运行。这个逻辑我哪里错了?如果我删除 ADDR 并只使用幻数,它就可以工作。

这是内存开始运行前的屏幕截图。

谢谢。

【问题讨论】:

    标签: assembly corewars redcode


    【解决方案1】:

    改变:

    MOV MOVE, ADDR   ; Move the imp to the ADDR
    SPL ADDR         ; Split a new processes at the ADDR
    

    到:

    MOV MOVE, @ADDR   ; Move the imp to the ADDR
    SPL @ADDR         ; Split a new processes at the ADDR
    

    如果您希望循环正常工作,请将 JMP MOVE 更改为 JMP START

    另外,您应该将第一行更改为 ORG START 而不是 JMP START


    我想我误解了你的部分问题,看起来你只是想创建两个 imp 进程,而我说要创建一个循环,如果你做这样的事情,你只有 2 个 imps 运行:

    org start
    
    addr dat #0, #1
    
    start
        add #80, addr
        mov imp, @addr
        spl @addr
    
    imp mov $0, $1
    

    但它不会跳回到开头并覆盖原始指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 2013-03-10
      • 1970-01-01
      • 2014-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多