Техника - молодёжи 1987-03, страница 48Кстати, для игр «со смертельным исходом», кроме вызова из какого-нибудь регистра заблаговременно записанной туда Тьмы (а этот способ применили некоторые читатели, приславшие свои модификации космических программ), можно воспользоваться предложением П. Кузнецова из Ленинграда: выполнить деление на знак «—», сформированный вручную (1 К —ВП ПО КИПО КИПО КИПО КИПО ИПО) или по программе: 00. f 01 .Сх02. ЛТОЗ.КНОПО4.ВП 05.С/П, на вход которой подается 9 (этот метод использован в программе В. Алексеева «Календарь»), После такого деления ПМК отказывается работать, но команды вызова из регистров действуют, так что можно проанализировать причины аварии. НОВОЕ СВОЙСТВО ЗГГОГа В №12 за 1986 год в переписке администрации КЭИ с конструктором первой шахматной программы Н. Авдеевым вскользь говорилось о нестандартном обращении со стеком подпрограмм (а его содержимое, напомним, определяет адреса, на которые передает управление команда В/О). При отладке анализатора ускорений выяснилось, что самый простой и надежный путь к господству над этим стеком дают ЗГГОГи, другие полезные свойства которых освещались в № 1 за 1986 год. Введем в ПМК мини-программу 00. В/О, вернемся в режим АВТ и посмотрим, как исполняется эта команда. Если сделать В/О ПП и перейти в режим ПРГ, убедимся, что управление передалось на адрес 01. Так и должно быть: в начальном положении стек подпрограмм заполнен нулями. Если же в программе встречается обращение ПП или КПП, в стеке записывается его адрес и стоящая в конце подпрограммы команда В/О передает управление на адрес, следующий за этим обращением (он на единичку больше записанного в стеке числа.) Если в подпрограмме содержится обращение к другой подпрограмме, в стек записы основан использованный в программе «Атмосфера-4» способ очистки засоренного при превышении допустимого ускорения стека подпрограмм. Цифровая комбинация в нем после команд 1 ВП 50 Fx2 Fx2 приобретает вид 0010000000, после первого В/О ПП происходит переход на адрес 01, после второго — на 11 и стек очищается. Кроме того, появилась реальная возможность в широких пределах управлять действием команды В/О. Если нужно, допустим, чтобы она при работе вне подпрограмм обеспечивала переход на адрес 78, достаточно в режиме АВТ скомандовать 1 ВП 50 Fx2 Fx2 77777777 X Сх, передать управление на адрес, где в программе располагается В/О, и нажать ПП. Первый переход, адрес которого (71) связан с длиной мантиссы ЗГГОГа, исполнен, в стеке остались одни семерки, и команда В/О обречена «до конца дней своих» (то есть до выключения ПМК или формирования следующего «сверхчисла») передавать управление на выбранный нами адрес. Для расширения области применения рассмотренного приема полезно было бы научиться формировать ЗГГОГи, мантисса которых включает не только цифры, но и шестнадцатеричные символы Е, Г и т. д. В этом случае, в частности, легко было бы обеспечить «постоянные» переходы командой В/О на адреса побочных ветвей В1 (стек подпрограмм должен быть заполнен символом «—»), С2 (соответственно буквой L), ГЗ (буквой С), Е4 (буквой Г), «пусто — 5» (буквой Е) и, возможно, 06 (символом «пусто»). К счастью, существует простая процедура получения таких ЗГГОГов, обнаруженная С. Пуховым. Чтобы ею воспользоваться, следует прежде всего сформировать и упрятать в какой-либо регистр «пустышку» (Сх ~ ВП ПД), затем прочистить стек (нажать несколько раз стрелку вверх) и получить каким-нибудь из уже рассмотренных в КЭИ способов нужную буквенно-цифровую заготовку. Скажем ЕОООООЕЕ (1 ВП 55 Fx2 Fx2 Fx2 ИПС ИПС ВП 6 П7 КИП7 ИП7 К — ВП КНОП). Теперь нужно проделать следующее: вызвать из регистра «пустышку» (ИПД), отдать какую-нибудь команду, код которой начинается с двойки, допустим, Fx2 (код 22; если код операции начинается с тройки, вместо ЗГГОГа получится чудовище 4-го этажа, а если с единицы — ЕГГОГ, в обоих случаях с требуемой мантиссой), затем Сх XY. На индикаторе — нужный нам ЗГГОГ. Можно записать его в какой-нибудь регистр, а затем «расшифровать» по известному алгоритму (П9 Сх ИП9 FABT точка КНОП). Мантисса ЗГГОГа, как видим, равна нашей буквенно-цифровой комбинации, а первые две цифры порядка совпадают с кодом команды, с помощью которой он был образован. Содержимое же стека подпрограмм приобрело вид ООЕОООООЕЕ. Михаил ПУХОВ вается новый адрес, а старый сдвигается в его глубину. Максимальное число подпрограмм, которые можно вложить одна в другую наподобие матрешек, для наших ПМК равно пяти. Поэтому стек подпрограмм в заполненном виде проще всего представить себе в виде десятизначного числа, каждая пара цифр в котором является адресом, предшествующим тому, на который передает управление команда В/О. Например, если стек заполнен комбинацией 3141592653, то В/О при первом исполнении передаст управление на адрес 32(31 + 1), при втором — 42 (41 + 1), при третьем — 60 (59 + 1), при четвертом — 27(26+1), при пятом — 54 (53 + 1). При исчерпании заданных адресов стек подпрограмм полностью заполняется последней цифрой бывшей в нем комбинации (в нашем случае приобретает вид 3333333333), теперь команда В/О всегда будет передавать управление на один и тот же адрес (скажем, 34 = 33+1). Именно поэтому вне подпрограмм она дает возможность переходить не только на адрес 01, но и на 12, 23, 34, 45, 56, 67, 78, 89 и АО. Об этом говорилось в позапрошлом выпуске КЭИ. Какое отношение ко всему этому имеет ЗГГОГ? Как выяснилось, самое непосредственное. Сформируем 1 ВП 50 Fx2 Fx2 и умножим на какое-нибудь целое число, допустим, 12345. Сбросив теперь ЗГГОГа (Сх), с помощью нашей мини-программы и нехитрой процедуры В/О пп Fnpr FABT в/о пп Fnpr FABT и т. д. без труда убедимся, что цифровая комбинация в стеке подпрограмм приобрела вид 4012345000, где первая цифра на единичку меньше числа знаков выбранного нами сомножителя (4 = 5—1), на втором месте располагается 0, а дальше следует само число 12345. И команда В/О передает управление последовательно на адреса 41, 13, 35, 51, а затем на 01. К аналогичным результатам пришел и студент МВТУ С. Федотов, обнаруживший также, что смена знака мантиссы ЗГГОГа приводит к увеличению на 9 первого адреса возврата. Именно на этом свойстве ЗГГОГа о з -Т о 43 |