В языке Паскаль используется два способа передачи параметров: по значению и ссылке (адресу переменной). Соответственно различают параметры-значения и параметры-переменные.
При обращении в программе к процедуре или функции в оперативной памяти ЭВМ (рис. 5.6) в области «Рекурсивного стека» создается «копия» рабочих полей этой подпрограммы, содержащая всю локальную для этой подпрограммы информацию, необходимую для ее выполнения.
| Рекурсивный стек
Динамически распределяемая область памяти
| Верхняя граница памяти
|
| Глобальные переменные
|
|
| Библиотечные модули (встроенные процедуры и функции)
|
|
| Константы и таблицы переходов операторов CASE
|
|
| Код программы
| Нижняя граница памяти
|
| Префикс программного сегмента
|
Рис. 5.6. Карта распределения оперативной памяти
Префикс программного сегмента строится операционной системой при загрузке *.ЕХЕ модуля в оперативную память ЭВМ, представляет собой совокупность данных, важных для выполнения программы под управлением операционной системой. Остальная память выделяется для программы на время ее выполнения. Рекурсивный стек размещается в памяти непосредственно перед верхней границей памяти и заполняется страницами по мере вызова процедур и функций при выполнении программы. Структура страницы представлена на рис. 5.7.
| Предыдущая страница стека
| Стек расширяется по направлению к младшим адресам памяти
|
| Возвращаемое значение функции
|
| Параметры
|
| Указатель возврата
|
| Локальные переменные
|
| Указатели связи
|
Рис. 5.7. Структура страницы стека
Поле 5 присутствует только в странице, отводимой при вызове функции. В это поле записывается результат (значение) функции, которое будет возвращено в тело вызывающего программного модуля. Параметры (поле 4) — это значения переменных, переданных в функцию или процедуру как параметры-значения. Для параметров-переменных здесь хранятся только адреса, а сами переменные находятся либо в поле 5 «Глобальные переменные», либо в поле 2 «Локальные переменные» одной из предыдущих страниц стека, если данная процедура (функция) была вызвана другой подпрограммой. Указатель возврата (адрес) обеспечивает выход из подпрограммы после ее завершения на оператор, следующий за оператором вызова подпрограммы. Если в подпрограмме используются переменные более высоких уровней вложения, то для связи с ними необходимо поле 1, содержащее адреса этих переменных.