![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Вход в подпрограмму и выход из подпрограммы
В самом понятии подпрограммы предполагается, что ее можно вызвать (т. е. обращаться к ней) в разных точках главной программы с последующим возвратом на продолжение главной программы. Поэтому должны существовать средства для сохранения адреса той точки в главной программе, в которую нужно вернуться. Существуют разные методы решения этой проблемы. Один из них заключается в использовании стека, встроенного в самом микропроцессоре или моделируемого в главной памяти. Этот метод принят в нашем иллюстративном микропроцессоре. Как было описано в предыдущей главе, по команде перехода на подпрограмму в нашем микропроцессоре содержимое программного счетчика (а оно в этот момент указывает на следующую команду в главной программе) запоминается в стеке. Впоследствии этот адрес снова загружается в программный счетчик, когда в конце подпрограммы выполняется команда «возврат из подпрограммы». Другой подход заключается в том, что адрес возврата сохраняется в области памяти, содержащей саму подпрограмму. Еще один метод, применяемый в некоторых системах, предусматривает сохранение возврата в каком-то специально обусловленном регистре центрального процессора. Вообще говоря, желательно, чтобы подпрограмма в свою очередь могла обратиться к другой подпрограмме. Такие обращения называются вложенными. Три упомянутых выше метода предоставляют разные возможности для организации вложенных обращений. При использовании стека допускается самая общая форма вложенных обращений. Стек позволяет одной подпрограмме обращаться не только к другим подпрограммам, но и к самой себе. Это возможно, поскольку при каждом входе в подпрограмму адрес возврата помещается в вершину стека, а все ранее запомненные адреса опускаются в стек и тем самым сохраняются. При возвратах запомненные адреса выбираются из стека в порядке, обратном тому, в каком они запоминались. Это соответствует порядку, в котором должны выполняться возвраты. Конечно, число уровней вложенности (т. е. число незавершенных подпрограмм) ограничивается размерами стека, поскольку каждый адрес возврата занимает один регистр в стеке. Стек нашего иллюстративного микропроцессора имеет 64 регистра и, следовательно, допускает 64 уровня вложений. Метод сохранения адреса возврата в самой подпрограмме позволяет подпрограмме обратиться к другой подпрограмме, но не к себе самой. Действительно, в ходе выполнения подпрограммы ячейка, где сохраняется адрес возврата, уже занята и не может принять еще один адрес. Однако этот метод не налагает никаких ограничений на число уровней вложенности, поскольку каждая подпрограмма на каждом уровне предоставляет место для адреса возврата. К числу недостатков этого метода нужно отнести то, что подпрограмму нельзя поместить в постоянное ЗУ, поскольку в ячейку с адресом возврата должна производиться запись. Для микропроцессоров, где часто используются постоянные программы, это последнее обстоятельство может оказаться решающим при выборе метода. При сохранении адреса возврата в одном фиксированном регистре вложенности подпрограмм вообще невозможны, поскольку в одном регистре можно сохранить адрес только одной подпрограммы. Однако эта проблема может быть решена программно путем добавления в подпрограмму команд, сохраняющих содержимое регистра в памяти перед обращением к другой подпрограмме. Ячейку для сохранения можно выбрать в области памяти, отличной от той, которую занимает сама подпрограмма, поэтому подпрограммы можно размещать в постоянной памяти. Возврат из подпрограммы можно осуществлять, передавая управление на ячейку с запомненным адресом. В отношении уровней вложенности такая схема эквивалентна предыдущей в том смысле, что подпрограмма может вызвать другие подпрограммы, но не себя. В микропроцессорах применяются все три описанных метода, но доминирует метод с использованием стека. Чаще стек реализуется не на аппаратных регистрах в микропроцессоре, а моделируется в ячейках главной памяти. При этом в микропроцессоре предусматривается специальный регистр, называемый указателем стека. Указатель стека содержит адрес ячейки, которая считается вершиной стека в текущий момент. В начале главной программы в указателе стека устанавливается некоторое начальное значение. Когда информация заносится в стек или удаляется из него, указатель автоматически продвигается вверх или вниз и, таким образом, все время указывает на вершину стека. Стек расширяется при поступлении новой информации и сжимается при ее удалении. В моделируемом стеке практически не возникает ограничений на число уровней вложенности.
|