|

Игры настоящих кодеров
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
|