Сохранение содержимого регистров

Рассмотрев соглашения, касающиеся организации входа в подпрограмму и возврата из нее, перейдем теперь к описанию некоторых дополнительных действий, необходимых для организации связи с подпрограммами. Обычно программы довольно активно пользуются регистрами для организации управления циклами, адресации и иных целей. Подпрограммы, естественно, тоже работают с регистрами, и если перед вызовом подпрограммы не принять никаких мер по обеспечению сохранности их содержимого, то после возврата уже нельзя считать, что это содержимое осталось прежним. Короче говоря, некоторые результаты, полученные основной программой, теряются при работе подпрограммы.

Чтобы избежать возникновения описанной ситуации, производится сохранение содержимого регистров перед каждым вызовом. Этого можно достичь засылкой интересующей нас информации в произвольную область памяти, содержимое которой не меняется в процессе работы подпрограммы. Непосредственно перед выполнением возврата к основной программе подпрограмма выполняет восстановление содержимого регистров, т. е. запись сохраненной информации на ее исходные места.

Итак, список требований, предъявляемых к подпрограммам, необходимо дополнить еще двумя пунктами. Необходимо производить сохранение содержимого регистров. Возврату управления основной программе должно обязательно предшествовать восстановление содержимого регистров. Итак, наш список теперь выглядит следующим образом:

S1: Сохранение регистров.

53: Восстановление регистров.

54: Переход по адресу, находящемуся в регистре 14 (выполнение возврата).

Прежде чем приступить к подробному разбору шагов S1 и S3, познакомимся еще с двумя командами.

Команды LM и STM

Команды LM (ЗАГРУЗКА ГРУППОВАЯ) и STM (ЗАПИСЬ В ПАМЯТЬ ГРУППОВАЯ) позволяют производить соответственно считывание информации из памяти сразу в несколько регистров и запись информации из регистров в память. Обе эти команды принадлежат множеству команд формата RS и, следовательно, требуют, чтобы адрес, указываемый в них, был адресом полного слова.

LM R1 ,R3,D2(B2)

Load Multiple

Загрузить регистры с номерами от R1 до R3 информацией из области памяти, начинающейся по адресу D2 + + (В2)

STM R1,R3,D2(B2)

STore Multiple

Записать содержимое регистров с номерами от R1 до R3 в последовательные ячейки памяти, начиная с адреса D2 + (B2)

Как видно из описания, операции производятся над содержимым группы регистров, имеющих номера между R1 и R3. Например, по команде

STM 2,5,STOR

(2) записывается по адресу STOR, (3) — по адресу STOR+4, (4) — по адресу STOR+8 и, наконец, (5) — по адресу STOR + 12. Процесс записи представлен схематически на рис. 13.3. Если когда-либо в дальнейшем мы пожелаем восстановить содержимое регистров таким, каким оно было до выполнения команды STM, то нам нужно будет всего лишь написать

LM 2,5,STOR

Статья 402 - Картинка 1

Рис. 13.3. Иллюстрация работы команды STM.

Статья 402 - Картинка 2

Рис. 13.4. Восстановление содержимого регистров с помощью команды LM.

В результате произойдет загрузка регистров информацией из области памяти, в которой было сохранено их прежнее содержимое. Процесс восстановления показан на рис. 13.4.

Если номер первого регистра превышает номер второго, т. е. R1 больше R3, то счет регистров идет сначала от R1 до 15 и затем от 0 до R3. По команде

LM 14.3.SA

производится загрузка слова SA в регистр 14, слова SA+4 в регистр 15, SA+8 в регистр 0, SA+12 в регистр 1, SA+16 в регистр 2, и, наконец, SA+20 в регистр 3. Если же R1 = R3, то в качестве операнда используется только один регистр. Другими словами, результат выполнения команд

STM 5,5,32(6)

и

ST 5,32(6)

одинаков.

Область сохранения

Для сохранения содержимого регистров при переходе к подпрограмме используется команда STM. Она дает возможность записывать информацию указываемых регистров в последовательные ячейки некоторой области памяти, называемой областью сохранения. Общепринятые соглашения относительно работы с этой областью таковы: сама область содержит 18 полных слов, и при переходе к подпрограмме в регистре 13 должен находиться адрес первого из них.

Согласно принятому соглашению, сохранение содержимого регистров производится, начиная с четвертого слов области сохранения. Содержимое регистров записывается в память в следующем порядке: 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Регистр 13 играет особую роль в процессе сохранения содержимого регистров, как мы увидим в дальнейшем, и поэтому требует особого обращения.

Статья 402 - Картинка 3

Рис. 13.5. Запись содержимого регистров в область сохранения, адрес которой находится в регистре 13.

Итак, мы хотим произвести запись содержимого регистров с 14-го по 12-й, начиная с четвертого слова области, адрес начала которой хранится в регистре 13. Этого можно достичь выполнением команды

STM 14,12,12(13)

(см. рис. 13.5). Для восстановления регистров по окончании выполнения подпрограммы достаточно произвести их загрузку значениями из области сохранения:

LM 14,12,12(13)

Эта команда должна непосредственно предшествовать команде возврата к основной программе.

Подводя итог всему сказанному, приведем теперь общую структуру произвольной подпрограммы, удовлетворяющей перечисленным требованиям. Пусть подпрограмма имеет имя SUBR. Общая структура ее такова:

SUBR START 0

STM 14,12,12(13) СОХРАНЕНИЕ РЕГИСТРОВ

Вычисления

LM 14,12,12(13) ВОССТАНОВЛЕНИЕ РЕГИСТРОВ

BR 14 ВОЗВРАТ

Резервирование памяти и константы

END

Одной из услуг, предоставляемых операционной системой; пользователю, является обеспечение возможности работы с макробиблиотекой, содержащей набор очень удобных для использования макрокоманд. В этот набор входят такие макро, как SAVE и RETURN. Для того чтобы сохранить содержимое регистров, достаточно лишь написать

SAVE (14,12)

В программе макро будет заменено на команду

STM 14,12,12(13)

Для восстановления содержимого регистров и выполнения возврата к основной программе нужно воспользоваться другим макро:

RETURN (14,12)

Это эквивалентно заданию пары команд:

LM 14,12,12(13)

BR 14

Использовать стандартные макро или писать эквивалентные им команды, является делом вкуса.