Вызов процедуры и возврат из нее

Общепринятым методом управления вызовами процедур и возвратами из них является использование стека. При обработке вызова процессор помещает в стек адрес возврата. При возврате из процедуры процессор использует адрес с вершины стека. На рис.1.26 и 1.27 показано использование стека при работе с вложенными процедурами.

 




 


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

Большую гибкость при передаче параметров обеспечивает стек. При обработке вызова процессор заносит в стек не только адрес возврата, но и параметры, передаваемые вызываемой процедуре, которая легко может получить доступ к ним. При возврате из процедуры возвращаемые значения также можно занести в стек, располагая их под адресом возврата. Набор всех параметров (включая адрес возврата), который сохраняется при обращении к процедуре, называется кадром стека(stack frame).

Рассмотрим пример программы, в которой используются процедуры Р и Q. В процедуре Р объявлены локальные переменные х1 и х2, а в Q — локальные переменные у1 и у2. Процедура Q может быть вызвана из Р. Схема работы стека при выполнении такой программы показана на рис. 1.28. На этом рисунке точка возврата из каждой процедуры является первой ячейкой соответствующего стекового кадра. Следующим сохраняется указатель на начало предыдущего кадра. Это необходимо на случай, если количество или размер заносимых в стек параметров являются переменными.