Игры настоящих кодеров Shen (_shen_@mail.ru) Спецвыпуск Xakep, номер #035, стр. 035-054-2 Правила Итак, язык, на котором пишутся программы-бойцы, называется Redcode. Рассказать в небольшой статье обо всех возможностях Redcode нереально, поэтому мы ограничимся основами, «каркасом» языка. Но прежде чем приступать непосредственно к коду, разберемся, как протекает бой в памяти. Единица измерения памяти в CoreWar – команда, она же инструкция. В отличие от ассемблера настоящего, в Redcode все инструкции «весят» одинаково: любая строка на Redcode занимает ровно одну «команду». Поле боя обычно имеет размер 8000. Т.е. программа, состоящая из восьми тысяч команд, займет собой все поле. Сначала pMARS загружает противников в память, размещая их на поле боя случайным образом (можно указать расположение и вручную, но по правилам турниров - random). Потом симулятор выполняет первую команду одного из бойцов (неважно какого), затем первую команду второго, вторую команду первого, вторую команду второго и т.д. Так повторяется до тех пор, пока одна из программ не будет признана проигравшей или симулятор не объявит ничью. Правила, вкратце, таковы: 1. Процесс, попытавшийся выполнить данные, а не код, погибает. 2. Программа, все процессы которой мертвы, проигрывает. Простая программа имеет всего один процесс, процессы же сложных программ могут исчисляться десятками. Ты, наверное, не совсем понял, что значит «выполнить данные, а не код» и т.д., но после прочтения следующего раздела все должно стать кристально ясно :). Redcode Redcode использует ассемблерные команды, но не в привычном стиле Intel, а в синтаксисе AT&T: <инструкция> <источник> <приемник> А не наоборот, как привыкли любители tasm’а, masm’а и прочих ассемблеров с синтаксисом Intel’а. Первая команда, с которой мы познакомимся – MOV, так как с ее помощью уже можно написать простейшего бойца. «MOV A, B» скопирует одну команду по адресу A, в место с адресом B. Отсчет ведется от текущей инструкции, т.е. «MOV -1, 1» скопирует команду, предшествующую MOV, на место команды, следующей после MOV. Если программа выглядит так: Команда №1 MOV -1, 1 Команда №2 то после выполнения команды «MOV -1, 1», она примет вид: Команда №1 MOV -1, 1 Команда №1 Просто, не так ли? Теперь мы может написать нашего первого воина. Его код состоит всего из одной строчки: MOV 0, 1 Эта единственная команда копирует саму себя на место следующей команды: Первый цикл: MOV 0, 1 ; сейчас pMARS выполнит эту команду Второй цикл: MOV 0, 1 MOV 0, 1 ; сейчас pMARS выполнит эту команду Третий цикл: MOV 0, 1 MOV 0, 1 MOV 0, 1 ; сейчас pMARS выполнит эту команду В дальнейшем слова «сейчас pMARS выполнит эту команду» мы будем заменять стрелкой «<---». Края поля боя замкнуты, т.е. после адреса 7999 снова идет 0, поэтому, приведенная выше программа, заполнив поле целиком, начнет следующий круг, и будет заполнять поле инструкциями «MOV 0, 1» до бесконечности. Это один из классических бойцов, и имя ему – Imp. Если принцип его работы на словах звучит не очень понятно, проведя в pMARS’е несколько схваток, ты точно во всем разберешься. Если сейчас мы стравим на поле боя двух Импов, симулятор провозгласит ничью: так как оба Импа имеют одинаковую скорость, они просто будут бесконечно «гоняться» друг за другом. Поэтому для испытаний нам потребуется другой боец. |