КОМАНДЫ ПЕРЕХОДА НА ПОДПРОГРАММУ

Подпрограмма представляет собой фрагмент программы, обращение к которому может иметь место в любой точке главной программы. Для перехода к подпрограмме в ЭВМ существуют команды безусловного и условного переходов к подпрограмме (ПП и ППУ). Их особенностью является то, что помимо перехода они должны обеспечить по окончании подпрограммы возврат к исходной программе, к той ее точке, откуда был совершен переход.

Ниже будут рассмотрены только команды безусловного перехода к подпрограмме (ПП), поскольку на практике они встречаются наиболее часто. Кроме того, отличие команд ПП и ППУ такое же, как и отличие команд БП и УП, т.е. перед выполнением команды ППУ происходит проверка какого-либо признака результата из РгС (регистр состояния).

Рассмотрим подробнее операции, необходимые для выполнения команды ПП в предположении, что длина команды L = 2 байта и используется прямая адресация. Эти операции поясняются схемой, приведенной на рис. 5.18.

Перед выполнением команды ПП формируется адрес возврата (Авозвр), т.е. (СчК) = (СчК) + L (в данном случае это адрес N+2). Затем Авозвр запоминается в ячейке памяти (регистре), адрес которой (которого) в явной или неявной форме указан в команде ПП. Затем в СчК заносится содержимое адресного поля команды ПП, т.е. адрес начала подпрограммы (А). В конце подпрограммы размещается команда возврата, которая фактически является командой БПК (безусловный косвенный переход), и указывает путем косвенной адресации (через ячейку ОП или регистр) адрес ячейки ОП, куда надо возвратиться для дальнейшего выполнения основной программы. В данном случае косвенная адресация осуществляется через регистр Рг.

 

 

 

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

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

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

Помимо рассмотренных операций для работы подпрограммы необходимо каким-либо образом сообщить ей о размещении обрабатываемых данных (входные параметры) и формируемых результатах (выходные параметры). Это можно сделать различными способами, но в настоящем курсе этот вопрос не рассматривается.