Соглашения о вызовах DLL 2
Автор: Dave Berg
CDECL - Порядок вызова справа налево, за выгрузку стека отвечает вызывающая
подпрограмма.
PASCAL - Порядок вызова слева направо, за выгрузку стека отвечает вызываемая
подпрограмма.
STDCALL - Порядок вызова справа налево, за выгрузку стека отвечает вызываемая
подпрограмма.
FASTCALL - Первые три параметра по возможности передаются через регистры
процессора. Если аргументов три или меньше и при отсутствии локальных переменных
вызываемая подпрограмма не создает кадров стека.
STDCALL был добавлен Microsoft для Win32. В нем скомбинированы лучшие черты
Pascal (очистка стека вызываемой подпрограммой) и CDECL (аргументы выталкиваются
слева направа - первый аргумент находится на вершине стека - делает простым
использование счетчика переменного количества аргументов). Перед STDCALL Windows
всегда использовался PASCAL, а для вызовов всех переменных аргументов
использовался CDECL. Теперь для всего этого всегда используется STDCALL.
FASTCALL реально доступен в 16-битных BC, но его используют не так много
программистов. Тем не менее, для вызова небольших быстрых подпрограмм, не
организующих выталкивание и помещение аргументов и не строящих кадры стека,
кадры могут быть расширены. Для примера, подпрограмма MIN/MAX выполняющая около
15 инструкций, выполняет 5, плюс дополнительные инструкции, по большей части для
работы с регистрами, где старые инструкции работали с памятью. Это не дало бы
такого эффекта в C поскольку: (a) такие простые программы реализовываются на
уровне макросов, и/или (b) компилятор имел тенденцию работать во всяком случае с
inline.
|