Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Игры настоящих кодеров

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-054-6


SPL 0 ; <---

MOV 0, 1

Команда SPL передает управление на себя, но одновременно создает второй процесс на команде MOV. Здесь у тебя может возникнуть вопрос: как pMARS проводит бой, если одна программа имеет два процесса, а другая – один? В таком случае ходы будут чередоваться следующим образом:

- программа 1, процесс 1

- программа 2, процесс 1

- программа 1, процесс 2

- программа 2, процесс 1

- программа 1, процесс 1

- программа 2, процесс 1

- программа 1, процесс 2

Т.е. больше в данном случае не значит лучше. Возвращаемся к нашему примеру. Теперь нам понадобятся две стрелки :).

SPL 0 ; <--- 2-ой процесс

MOV 0, 1 ; <--- 1-ый процесс

Заметь, что процесс, созданный SPL, становится вторым процессом, а не первым.

SPL 0 ; 3-ий процесс

MOV 0, 1 ; 2-ой процесс

MOV 0, 1 ; 1-ый процесс

Опять же, обрати внимание, что процессы, создаваемые SPL, помещаются в конец так называемой «очереди процессов». Приведенная программа будет создавать новый процесс с Импом каждый раз, когда очередь дойдет до процесса, в котором выполняется команда «SPL 0». Теперь, разобравшись с процессами, можно приступать к рассмотрению техники ImpRing. Существует несколько различных вариантов этого метода, но мы рассмотрим один из самых простых, который использовал А.Ивнер в своем "Трезубце":

JMP imp-2666

start SPL -1 ; <--- 1-ый процесс

SPL imp+2667

imp MOV 0, 2667

В этом примере первый раз за всю статью используются метки – здесь без них не обойтись. Метка imp введена исключительно для удобства объяснения, а вот обозначение start необходимо, чтобы указать точку входа в программу. Будет немного запутанно, но что поделаешь?

Команда SPL разбивает первый процесс на два: вторым становится инструкция, следующая за SPL, а третьим – инструкция, на которую указывает операнд SPL:

JMP imp-2666 ; <--- 3

start SPL -1

SPL imp+2667 ; <--- 2

imp MOV 0, 2667

Выполняется еще одна команда SPL: второй процесс разбивается на четвертый и пятый, причем пятый находится аж через 2667 инструкций после метки imp. Заметь также, что пятый процесс сейчас находится в чистом поле. Если мы не успеем поставить на его пути команду, он погибнет!

JMP imp-2666 ; <--- 3

start SPL -1

SPL imp+2667

imp MOV 0, 2667 ; <--- 4

imp+2667:

DAT #0, #0 ; <--- 5

Выполняется команда JMP, создавая процесс №6:

imp-2666:

DAT #0, #0 ; <--- 6

JMP imp-2666

start SPL -1

SPL imp+2667

imp MOV 0, 2667 ; <--- 4

imp+2667:

DAT #0, #0 ; <--- 5

Выполняется четвертый процесс – MOV копирует себя по адресу imp+2667. Если бы мы этого не сделали, следующим ходом процесс №5 выполнил бы DAT #0, #0 и погиб!

imp-2666:

DAT #0, #0 ; <--- 6

JMP imp-2666

start SPL -1

SPL imp+2667

imp MOV 0, 2667

… ; <--- 7

Назад на стр. 035-054-5  Содержание  Вперед на стр. 035-054-7