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