|
Таким образом, модули, которые мы хотим перемещать из одного места памяти в другое, не могут быть совершенно произвольными. Потребуем, чтобы все внутренние адреса модуля обязательно удовлетворяли неравенствам ая ^ А <; ак и ан ^ А' ак. Потребуем также, чтобы команды и заготовки, содержащие такие адреса, располагались внутри модуля в ячейках с адресами от ся до ск (так что ан ^ <с ся ^ ск ^ ак). Удовлетворить этим требованиям при составлении модуля нетрудно. Адреса си и ск — тоже внутренние. Если модуль фактически размещен, начиная с адреса Ьн, то корректировке подлежат лишь коды команд (или заготовок), расположенные в ячейках с адресами от сп = ся + frH — ап до с'к = ск -f feH — #н-Итак, нам надо составить подпрограмму, которая просматривает все слова с адресами i из диапазона c'R ^ i с'к, читает их как коды команд, исследует адреса этих команд и к каждому адресу А, удовлетворяющему неравенствам ан <: А ^ ак, добавляет приращение б. Эта подпрограмма представляет собой цикл, в котором i пробегает значения от сп до с'к. При составлении рабочей части этого цикла будем считать, что код исследуемой команды (из ячейки с адресом i), имеющий вид г я КОП Аг А2 А3 помещен (на время его обработки) в ячейку г, а в ячейке q размещается код q - п КОП А/ • А/+1 А/+2» /^Ь где As = 0 при s > 3, а при s ^ 3 величина А5 в кодах г и q имеет одно и то же значение. Независимо от значения адресов А;+1 и А/+2 операция где sx — адрес константы вырабатывает значение со = 0, если А, ^ан,и© = 1, если Ау< ап. Неравенство Aj^aK эквивалентно неравенству А;- <^ак + 1, поэтому для его проверки достаточно выполнить операцию где в ячейке s2 хранится константа В зависимости от результата этих двух проверок надо выполнить или не выполнять операцию где константы d+ 1 -s- d + 3 имеют вид Для перехода к следующему значению / адресную часть кода в ячейке q надо сдвинуть на 1210 разрядов влево. Если после сдвига адресная часть равна нулю (со = 1), то корректировка команды закончена. Это заведомо случится, если / > 3. Поэтому для выхода из цикла по / можно воспользоваться командой ОЯ А с Ах = 0. Итак, внутренний цикл подпрограммы может быть таким: то на рх
|