|

Игры настоящих кодеров
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, выглядит так:
Назад на стр. 035-054-4 Содержание Вперед на стр. 035-054-6
|