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