Всего на сайте:
248 тыс. 773 статей

Главная | Информатика

Вход в подпрограмму и выход из подпрограммы  Просмотрен 182

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

Как было описано в предыдущей главе, по команде перехода на подпрограмму в нашем микропроцессоре содержимое программного счетчика (а оно в этот момент указывает на следующую команду в главной программе) запоминается в стеке. Впоследствии этот адрес снова загружается в программный счетчик, когда в конце подпрограм­мы выполняется команда «возврат из подпрограммы».

Другой подход заключается в том, что адрес возврата сохраняется в области памяти, содержащей саму подпрограмму. Еще один метод, применяемый в некоторых системах, предусматривает сохранение возврата в каком-то специально обусловленном регистре централь­ного процессора.

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

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

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

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

Предыдущая статья:Использующая таблицу переходов Следующая статья:Подпрограмму через общие регистры
page speed (0.0183 sec, direct)