Помогая понять RedCode - PullRequest
       8

Помогая понять RedCode

2 голосов
/ 21 января 2009

Я пытаюсь выучить красный код, потому что делать бота выглядит забавно.

Введение

Для тех, кто не знает, что такое красный код, вот краткое объяснение. Это 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 Ответ

3 голосов
/ 21 января 2009

Хорошо, это заняло совсем немного времени, но вот ваш ответ:

Первая инструкция, как вы правильно догадались, превращает Top в DAT # 0, # 12. Достаточно просто, но следующая инструкция сложнее. Во-первых, он уменьшает значение B цели (делая его 832). Затем он копирует инструкцию сверху в положение на 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, поэтому на 832 строки впереди относительно Target находится строка 839.

Надеюсь, что это прояснит для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...