Cтраница 2
Теперь работа по выходу из подпрограммы состоит в передаче управления по адресу возврата и в перемещении указателя L. В результате восстанавливается то состояние стека. Если подпрограмма выработала какие-то результаты, то операция выхода должна включать в себя копирование результатов на место аргументов. [16]
Теперь работа по выходу из подпрограммы состоит в передаче управления по адресу возврата и в перемещении указателя L. В результате восстанавливается то состояние стека, которое имело место при входе в подпрограмму. Если подпрограмма выработала какие-то результаты, то операция выхода должна включать в себя копирование результатов на место аргументов. [17]
![]() |
Выполнение операций над стеком. [18] |
Для полного понимания принципов обработки прерываний программист должен хорошо представлять операции под стеком. На рис. 1.19 показаны три состояния стека. [19]
Проанализируйте рассмотренный выше алгоритм вычисления выражения и приготовьте таблицу состояний стека, подобную приведенной на рис. 3.5. Как вы считаете, улучшилась ли от этого программа. [20]
После вычисления значения процедуры-функции р и выхода из блока р переменные, локализованные в теле процедуры, становятся недоступными. Однако в общем случае возобновляется доступ к переменным, локализованным в блоке, из которого произошло обращение к процедуре. Следовательно, необходимо восстановить состояние стека, которое было до обращения к процедуре. Для этого используют связующую информацию, помещенную в начале участка стека, отведенного для процедуры-функции. [21]
При каждом переходе к новой подпрограмме указатель стека перемещается к следующей ячейке, в которую и пересылается адрес возврата. Для осуществления возврата адрес возврата считывается из стека: содержимое верхней ячейки передается в адресный регистр, а указатель смещается вниз. На рис. 4.4 показано состояние стека в различные моменты при отображении ряда подпрограмм, входящих друг в друга. [22]
В рассматриваемом примере подпрограмма второго уровня обеспечивает умножение чисел с тройной точностью. Во время выполнения этой подпрограммы необходимо выделить временную область памяти, используемую при выполнении команды сдвига влево содержимого 3-байтового поли, На рис. 13.12 показано размещение каждого байта множимого, занимающего 3 байт памяти в стеке. На рис. 13.12, а изображено состояние стека после пересылки в него младшего байта множимого. Указатель стека, изображенный на рисунке стрелкой, определяет здесь, как и везде, следующую свободную область стека. [23]
При этом стек продвинется вверх, и состояние его будет запомнено. В качестве базового регистра области локальных данных вызванной процедуры будет использован регистр 4, его - прежнее содержимое будет автоматически сохранено в стеке, а доступ к регистрам с - номером выше четырех будет закрыт. После выполнения в процедуре команды воаврата автоматически восстанавливаются состояния стека и базовых регистров, которые они имели перед вызовом, исключая случай, когда вызванная процедура имела тип функций. [24]
Решения приведенных ниже задач оформлены следующим образом: краткое пояснение собственно решения, алгоритм, программа для МК-54, контрольные вычисления. Справа от описания алгоритма отведены три столбца: для комментариев, величин и соответствующих им регистров памяти. Программа для МК-54 располагается вертикально, содержит столбцы, в которых отражается состояние стека, снабжена комментариями и разбита на горизонтальные полосы. Внутри одной полосы описывается, как правило, реализация одной строки алгоритма. Это соответствие отражено в комментариях к программе. [25]
Окончив свое выполнение, процедура С выйдет на команду возврата, и процедура А продолжит свое выполнение. Вся необходимая для возврата информация находится в стеке, а адрес, опираясь на который можно осуществить этот возврат, находится в регистре F. В самом деле, в следующем слове за MSCW, на которое указывает F, расположено управляющее слово внешней процедуры, а в самом MSCW находится ссылка на MSCW, указывающая состояние стека внешней процедуры. В свою очередь, закончив свое выполнение, процедура А осуществляет возврат в самый внешний блок. Таким же путем производится обращение к процедуре В и от В и С. [26]
![]() |
Команды управления. [27] |
Все команды выполняются в привилегированном режиме. Команды ЗАКРВП / ОТКВП устанавливают в 0 / 1 тригер МВП. Команда ВЫЧМА вычеркивает в ОП стоаницу с адресом в ABC. Команда СМСТЕК переключает процессор на новый стек; состояние текущего стека не запоминается. [28]