6.7. Передача параметра

На верх  Назад  Вперёд

При вызове процедуры или функции компилятор выполняет следующие действия:

1.Если имеются какие-либо параметры для передачи в процедуру, они сохраняются в известных регистрах, а если имеется больше параметров, чем свободных регистров, то они помещаются в стек слева направо.

2.Если вызывается функция, которая возвращает значение типа String, Set, Record, Object или Array, то возвращается адрес для хранения результата функции, аналогично выполняется передача в процедуру.

3.Если вызываемая процедура или функция – это метод объекта, то указатель на self передаётся в процедуру.

4.Если процедура или функция вложена в другую функцию или процедуру, то указатель фрейма родительской процедуры помещается в стек.

5.Возвращаемый адрес помещается в стек (это делается автоматически с помощью инструкции, вызывающей подпрограмму).

В результате фрейм стека при выходе выглядит так, как показано в таблице 6.5.

Таблица 6.5. Фрейм стека при вызове процедуры (32-битная модель).

Смещение

Что записано

Дополнительно?

Расширенные параметры

Да

+12

Результат функции

Да

+8

self

Да

+4

Возвращаемый адрес

Нет

+0

Указатель фрейма родительской процедуры

Да

6.7.1. Выравнивание параметров