Стековые фреймы для вложенных подпрограмм

 

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

В программе, приведенной в таблице 17.4, главная подпрограмма вызывает подпро­грамму SUB1, которая, в свою очередь, вызывает подпрограмму SUB2. Стековые фреймы этих двух вложенных подпрограмм изображены на рис. 17.6. Все их пара­метры передаются через стек. На рисунках показаны только поток выполнения подпрограмм и их данные — реализация основных задач опущена.

 

 

Таблица 17.4

Метка Команда Операнды Комментарий
Главная программа (MAIN)
  Move PARAM2,-(SP) Помещение параметров в стек
  Move PARAM1,-(SP)  
  Call SUB1 Вызов подпрограммы
  Move (SP),RESULT Сохранение результата
  Add #8,SP Восстановление указателя стека
  …….    
Первая подпрограмма (SUB1)
SUB1 Move FP,-(SP) Сохранение указателя фрейма
  Move SP,FP Загрузка указателя фрейма
  MoveMultyple R0-R3,-(SP) Сохранение регистров
  Move 8(FP),R0 Считывание первого параметра
  Move 12(FP),R1 Считывание второго параметра
  …….    
  Move PARAM3,-(SP) Помещение параметров в стек
  Call SUB2 Вызов подпрограммы
  Move (SP),+R2 Выталкивание результата работы SUB2 в R2
  …..    
  Move R3,8(FP) Помещение ответа в стек
  MoveMultyple (SP)+,R0-R3 Восстановление регистров
  Move (SP),+FP Восстановление указателя фрейма
  Return   Возврат в главную программу
Вторая подпрограмма (SUB2)
SUB2 Move FP,-(SP) Сохранение указателя фрейма
  Move SP,FP Загрузка указателя фрейма
  MoveMultyple R0-R1,-(SP) Сохранение регистров R0,R1
  Move 8(FP),R0 Считывание параметров
  …….    
  Move R1,8(FP) Помещение в стек результата работы SUB2
  MoveMultyple (SP)+,R0-R1 Восстановление регистров R0,R1
  Move (SP),+FP Восстановление указателя фрейма
  Return   Возврат управления подпрограмме SUB1

 

 
 

 


Рис. 17.6. Стековые фреймы программы, приведенной в табл. 4.

 

Порядок выполнения этой программы следующий. Главная программа поме­щает в стек два параметра, рагаm2 и paraml (именно в таком порядке), а затем вы­зывает подпрограмму SUB1. Данная подпрограмма должна вычислить некоторое значение и передать его обратно главной программе через стек. В ходе вычисле­ний SUB1 вызывает вторую подпрограмму SUB2, выполняющую некоторую подзадачу. Подпрограмма SUB1 передает подпрограмме SUB2 один параметр рагаmЗ, и получает результат. После того как в подпрограмме SUB2 будет выполнена команда RETURN, подпрограмма SUB1 сохранит этот результат в регистре R2. Затем подпрограмма SUB1 продолжит свои вычисления, а закончив их, передаст ответ главной программе через стек. Когда управление будет возвращено главной программе, она сохранит полученный результат в памяти по адресу RESULT и продолжит свою работу со следующей команды. Этот процесс достаточно подробно описан в комментариях в таблице 17.4. Первым делом каждая подпрограмма устанавливает указатель фрейма (предварительно записав в стек его исходное содержимое) и сохраняет значения тех регистров, которыми она собирается оперировать. Например, подпрограмма SUB1 исполь­зует четыре регистра, от R0 до R3, a подпрограмма SUB2 — два регистра, R0 и R1. Все указанные регистры, а также указатель стека восстанавливаются перед выходом из подпро­граммы.

Для загрузки параметров из стека и помещения результатов обратно в стек используется индексный режим адресации с использованием регистра указателя фрейма FP. В этих операциях, как и в случае стека, показанного на рис. 17.6, задается бай­товое смещение 8,12 и т. д. Обратите внимание на тот факт, что за удаление пара­метров из стека всегда отвечает вызывающая программа. Эту операцию выполня­ет команда Add в главной программе и команда Move, расположенная по адресу 2164 в подпрограмме SUB1.

 

 

Контрольные вопросы

 

1. Как выполняются команды вызова подпрограмм?

2. Что такое стек?

3. Назовите основные операции со стеком

4. Как осуществляется передача параметров при вызове подпрограмм?

5. В чем различие передач параметров по значению и ссылке?

6. Что такое стековый фрейм?

7. Как реализуются стековые фреймы для вложенных подпрограмм?








Дата добавления: 2015-09-29; просмотров: 1727;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.