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

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

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

Результат функции возвращается в аккумуляторе (первый регистр), если его размер вписывается в регистр. Вызовы методов (из объектов или классов) имеют дополнительный невидимый параметр - 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 больше не используется.