6.3. Механизм вызова

Вверх  Предыдущий  Следующий

По умолчанию механизм вызова компилятора использует регистры, то есть компилятор пытается поместить так много параметров, насколько это возможно, записывая их в свободные регистры. Не все регистры используются, потому что некоторые регистры имеют специальное назначение, но это определяется типом процессора.

Результат функции возвращается в аккумулятор (первый регистр), если его размер вписывается в регистр. Вызовы методов (из объектов или классов) имеют дополнительный невидимый параметр self. Этот параметр самый левый в пределах вызова метода (поэтому последний параметр передаётся в метод).

Когда процедура или функция выполняет выход, она очищает стек.

Другие вызовы методов доступны для компоновки с внешними объектными файлами и библиотеками и описаны в таблице 6.3. В первой колонке перечислены модификаторы, которые указываются при объявлении процедуры. Вторая колонка содержит список очерёдностей параметров, помещаемых в стек. Третья колонка указывает, кто отвечает за очистку стека: вызывающая или вызываемая функция. Колонка ВЫРАВНИВАНИЕ показывает выравнивание параметров, отправленных в область стека.

Подпрограммы будет изменять количество регистров (летучие регистры). Перечень регистров, которые будут изменяются зависит от процессора, вызова и ABI на целевой платформы.

Таблица 6.3. Механизм вызовов в Free Pascal

Модификатор

Порядок помещения параметров

Стек очищается

Выравнивание

Нет

Слева направо

Функцией

По умолчанию

register

Слева направо

Функцией

По умолчанию

cdecl

Справа налево

Вызывающим

Выравнивание GCC

interrupt

Справа налево

Функцией

По умолчанию

pascal

Слева направо

Функцией

По умолчанию

safecall

Справа налево

Функцией

По умолчанию

stdcall

Справа налево

Функцией

Выравнивание GCC

oldfpccall

Справа налево

Вызывающим

По умолчанию

Учтите, что соглашение о вызовах oldfpccall эквивалентно соглашению о вызовах по умолчанию на процессорах, отличных от 32-разрядных Intel 386 или выше.

Более подробно об этой теме см. в разделе 7. ВОПРОСЫ КОМПОНОВКИ или в ссылках. Информацию о сохранённых регистрах GCC, выравнивании стека GCC и основном выравнивании стека в операционных системах выходит за пределы данного рукводства.

С версии 2.0 (на самом деле начиная где-то с версии 1.9) модификатор register является соглашением о вызовах по умолчанию, ранее по умолчанию был oldfpccall.

Соглашение о вызовах по умолчанию, то есть соглашение, используемое в директиве {$calling }, описано в разделе 1.2.7. $CALLING : Определить соглашение о вызовах. Соглашение по умолчанию для текущей платформы может быть указано следующим образом:

{$CALLING DEFAULT}

ПРИМЕЧАНИЕ

Модификатор popstack больше не поддерживается, начиная с версии 2.0, он был переименован в oldfpccall. Модификатор saveregisters больше не используется.