Игры настоящих кодеров Shen (_shen_@mail.ru) Спецвыпуск Xakep, номер #035, стр. 035-054-4 JMP 1 ; <--- Что происходит? JMP передает управление на следующую команду, а следующей команды нет! Изначально, до того, как выпустить бойцов на поле, pMARS заполняет поле нулями, т.е. данными. И наша программа, пытаясь выполнить данные, а не код, погибает! Теперь-то ты точно понимаешь, как работает Имп: он мостит перед собой дорогу инструкциями «MOV 0, 1» и поэтому никогда не выполнит данные вместо кода! У тебя не возникает никаких идей? А нельзя ли насильно заставить вражескую программу выполнить данные? Например, подбросить на пути Импа пару ноликов? Можно! Команда DAT определяет данные. Первое поле команды ни на что не влияет, но может использоваться для адресации, второе же задает то число, которое будет расположено на этом месте. В самом начале поле боя заполнено командами «DAT #0, #0», т.е. нулями. Вот боец-самоубийца: JMP 1 ; <--- DAT #0, #0 Он полностью идентичен предыдущему (JMP 1), но так нагляднее. Теперь, овладев основами Redcode, мы может создать первого настоящего бойца! Dwarf Сразу же даю листинг, а разбираться будем потом: ADD #4, 3 ; <--- MOV 2, @2 JMP -2 DAT #0, #0 Команда ADD прибавит число 4 к B-полю инструкции «DAT #0, #0», превратив ее в «DAT #0, #4»: ADD #4, 3 MOV 2, @2 ; <--- JMP -2 DAT #0, #4 Команда MOV скопирует команду «DAT #0, #4» по адресу, содержащемуся в B-поле инструкции «DAT #0, #4», т.е. по адресу 4, относительно команды DAT: ADD #4, 3 MOV 2, @2 JMP -2 ; <--- DAT #0, #4 … … … DAT #0, #4 Теперь JMP переведет управление на две команды назад: ADD #4, 3 ; <--- MOV 2, @2 JMP -2 DAT #0, #4 … … … DAT #0, #4 ADD прибавит 4 к B-полю команды «DAT #0, #4», превратив ее в «DAT #0, #8»: ADD #4, 3 MOV 2, @2 ; <--- JMP -2 DAT #0, #8 … … … DAT #0, #4 MOV скопирует инструкцию DAT #0, #8 по адресу 8, относительно инструкции «DAT #0, #8»: «DAT #0, #8»: ADD #4, 3 MOV 2, @2 JMP -2 ; <--- DAT #0, #8 … … … DAT #0, #4 … … … DAT #0, #8 Теперь JMP снова передаст управление на ADD, и все повторится: еще через четыре инструкции программа бросит команду «DAT #0, #12». Дварф (так называется этот боец) бомбит поле боя данными, с промежутком в три инструкции. Враг, наступивший на бомбу, т.е. пытающийся выполнить команду DAT, погибает. Но ты ведь помнишь, что поле боя замкнуто, и, добомбив его до конца, Дварф начнет закидывать DAT’ы, начиная с адреса 0, и вскоре сам попадет под собственные бомбы! Нет, не попадет. Не зря же промежуток между минами составляет ровно три инструкции – этого как раз хватает, чтобы сама программа смогла поместиться между бомбами. Т.к. команда ADD каждый раз прибавляет к DAT’у число четыре, то Дварф защищен от собственных мин на любом поле, размер которого кратен четырем. Минутку, ведь враг тоже может проскочить между снарядами? Да, может. Но чего ты хотел от бойца в четыре строчки? :) Имполовка Сейчас я расскажу тебе о приеме, называемом ImpGate, и курс «Основы Redcode» можно считать оконченным. Многие серьезные CoreWar-программы тем или иным способом используют принцип саморазмножающихся Импов: кто-то делает ставку на «Кольцо», когда в атаку одновременно идут несколько Импов, кто-то использует их как прикрытие, но факт остается фактом – Импы живы! А значит, надо уметь противостоять им. Итак, имполовка, по научному ImpGate: |