Минуло уж много лет с тех пор, как на свет появился первый компьютерный вирус. Теперь их присутствие уже никого не удивляет. В общем, времена меняются, мир растёт, но часто хочется чего-нибудь тёплого, лампового.
И в этой статье, как и обещал, расскажу о игре для программистов Corewars: о том, что это и как играть. А ещё мы рассмотрим некоторые примеры(на Redcode) и тактики игры.
Бой в памяти (Core War) — разновидность компьютерной игры «Дарвин» разработанная Александром К. Дьюдни. Помогал разрабатывать игру Дэвид Джонс, студент кафедры информатики университета Западной Онтарио, где преподавал Дьюдни.
В данной игре игроки разрабатывают компьютерные программы на специальном языке программирования, похожем на ассемблер — Redcode. Программы размещаются в циклически замкнутом участке памяти (core), состоящей из 8000 ячеек и зацикленной в кольцо. Каждая команда занимает одну ячейку. Redcode-программы работают под управлением MARS (англ. Memory Array Redcode Simulator — Симулятор Массива Памяти Redcode). Программы загружаются по случайным адресам в памяти.
Инструкция Аргументы Описание MOV A B - переслать содержимое ячейки с адресом A в ячейку с адресом B ADD A B - прибавить содержимое ячейки с адресом A к ячейке с адресом B SUB A B - вычесть содержимое ячейки с адресом A из ячейки с адресом B MUL A B - умножить содержимое ячейки с адресом A на ячейки с адресом B DIV A B - разделить содержимое ячейки с адресом A на ячейки с адресом B MOD A B - делит содержимое ячейки с адресом A на ячейки с адресом B
с остатком JMP A - передать управление на адрес A JMZ A B - передать управление на адрес A, если содержимое ячейки с адресом B равно нулю JMG A B - передать управление на адрес A, если содержимое ячейки с адресом B больше нуля DJZ A B - вычесть единицу из содержимого ячейки с адресом B и передать управление на адрес A, если содержимое ячейки с адресом B равно нулю CMP A B - сравнить содержимое ячеек с адресами A и B, если они не равны, пропустить следующую инструкцию SEQ A B - сравнить содержимое ячеек с адресами A и B, если они равны, пропустить следующую инструкцию SLT A B - сравнить содержимое ячеек с адресами A и B, если первое меньше второго, пропустить следующую инструкцию SNE A B - то же самое, что и CMP SPL B - породить новый поток по адресу B STP A - сохранить содержимое ячейки с адресом B в складе ячеек LDP A - загрузить содержимое ячейки с адресом B из склада ячеек DAT B - неисполняемое выражение, B — данные. При попытке выполнения программа останавливается NOP - нет операций
Всё, что после ; - комментарии
Отдельно нужно обозначить инструкцию SPL: она позволяет запустить
ещё один поток выполнения.
Это позволяет программам размножаться, но следует помнить о том,
что скорость выполнения каждой задачи в отдельности падает пропорционально.
Если поток натыкается на что-то отличное от инструкции(ячейку данных),
то исполнение потока прерывается. Кстати да, для тех, кто хочет чего-то
более привычного есть специальная версия с ассемблером 8086.
Ну-с теперь к практике.Начнём с HelloWorld.
Imp
Самым простым программой - воином в этой игре является так называемый Imp,
состоящий всего из одной комманды.
;redcode
;name Imp
;author A. K. Dewdney
;strategy imp
;history The "Hellow World" of warriors
mov 0, 1
Выполняясь, этот код перемещает сам себя вперёд на одну ячейку.
Таким образом пробегая вперёд и заполняя собой память.
Midget
Теперь ознакомимся со стратегией Bomber. Помните, я писал, что поле того, как поток исполнения натыкается на DAT, он завершается. На этом и основана данная стратегия.
;redcode
;name Midget
;author Chip Wendell
;strategy stone (bomber)
;history Third place at the 1986 ICWS tournament
Bomb dat #0, #-980
Spacer equ 28
Start mov Bomb, @Bomb ; Бросаем бомбу по адресу Bomb
sub #Spacer,Bomb ; Bomb=Bomb-Spacer
jmp Start, #0 ; Переходим в ячейку Start
end Start
;name Midget
;author Chip Wendell
;strategy stone (bomber)
;history Third place at the 1986 ICWS tournament
Bomb dat #0, #-980
Spacer equ 28
Start mov Bomb, @Bomb ; Бросаем бомбу по адресу Bomb
sub #Spacer,Bomb ; Bomb=Bomb-Spacer
jmp Start, #0 ; Переходим в ячейку Start
end Start
Mice
Это уже не такой простой воин. Его тактика называется replicator - т.е. создаёт свою копию в другой части памяти и запускает новый поток выполнения.
;redcode
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
; Top,Start,Loop и т.д. - метки
Top dat #0, #0 ; Данные (Здесь используется как счетчик)
Start mov #12, Top ; установим в счётчик значение 12
Top dat #0, #0 ; Данные (Здесь используется как счетчик)
Start mov #12, Top ; установим в счётчик значение 12
Loop mov @Top, <Target ; копируем инструкциию по относительному адресу
;лежащему в Top с предекрементом Target
djn Loop, Top ;вычесть единицу из содержимого ячейки с адресом Top
; и передать
управление на адрес Loop, если содержимое ячейки с адресом Top!=0
spl @Target,0;Создаём новый поток
Spacer equ 653
add #Spacer, Target ; Прибавляем Spacer к ячейке Target
jmz Start, Top; передать управление на адрес Start,
;если содержимое ячейки
с адресом Top больше нуля
end Start ; Точка входа в программу - Start
Чтобы разобраться нам понадобятся модификаторы инструкции
MOV
.A
-- moves the A-field of the source into the A-field of the destinationMOV
.B
-- moves the B-field of the source into the B-field of the destinationMOV
.AB
-- moves the A-field of the source into the B-field of the destinationMOV
.BA
-- moves the B-field of the source into the A-field of the destinationMOV
.F
-- moves both fields of the source into the same fields in the destinationMOV
.X
-- moves both fields of the source into the opposite fields in the destinationMOV
.I
-- moves the whole source instruction into the destination
Кстати, да, апогеем развития войнов Redcode считается момент создания первой полиморфной программы, которые впоследствии стали самыми эффективными.
Что скачать, чтобы попробовать?
Скачать всё необходимое можно ЗДЕСЬ.
Для пользователей мелкомягкой системы можно для начала побаловаться с Core Win, которая проста в обращении и не требует настройки.
Для продвинутых CoreWars-хакеров существуют целые отладочные пакеты, которые вы также найдёте по ссылке выше.
Развлекайтесь интеллектуально, друзья!
Комментариев нет:
Отправить комментарий