6.3. Механизм вызова |
Вверх Предыдущий Следующий |
По умолчанию механизм вызова компилятора использует регистры, то есть компилятор пытается поместить так много параметров, насколько это возможно, записывая их в свободные регистры. Не все регистры используются, потому что некоторые регистры имеют специальное назначение, но это определяется типом процессора. Результат функции возвращается в аккумулятор (первый регистр), если его размер вписывается в регистр. Вызовы методов (из объектов или классов) имеют дополнительный невидимый параметр self. Этот параметр самый левый в пределах вызова метода (поэтому последний параметр передаётся в метод). Когда процедура или функция выполняет выход, она очищает стек. Другие вызовы методов доступны для компоновки с внешними объектными файлами и библиотеками и описаны в таблице 6.3. В первой колонке перечислены модификаторы, которые указываются при объявлении процедуры. Вторая колонка содержит список очерёдностей параметров, помещаемых в стек. Третья колонка указывает, кто отвечает за очистку стека: вызывающая или вызываемая функция. Колонка ВЫРАВНИВАНИЕ показывает выравнивание параметров, отправленных в область стека. Подпрограммы будет изменять количество регистров (летучие регистры). Перечень регистров, которые будут изменяются зависит от процессора, вызова и ABI на целевой платформы. Таблица 6.3. Механизм вызовов в Free Pascal
Учтите, что соглашение о вызовах oldfpccall эквивалентно соглашению о вызовах по умолчанию на процессорах, отличных от 32-разрядных Intel 386 или выше. Более подробно об этой теме см. в разделе 7. ВОПРОСЫ КОМПОНОВКИ или в ссылках. Информацию о сохранённых регистрах GCC, выравнивании стека GCC и основном выравнивании стека в операционных системах выходит за пределы данного рукводства. С версии 2.0 (на самом деле начиная где-то с версии 1.9) модификатор register является соглашением о вызовах по умолчанию, ранее по умолчанию был oldfpccall. Соглашение о вызовах по умолчанию, то есть соглашение, используемое в директиве {$calling }, описано в разделе 1.2.7. $CALLING : Определить соглашение о вызовах. Соглашение по умолчанию для текущей платформы может быть указано следующим образом: {$CALLING DEFAULT}
|