Отладка приложений


Соглашения о вызовах - часть 2


— Пер.

Читатель, никогда не встречавшийся с соглашениями о вызовах, может задаться вопросом: почему существуют различные их типы?. Различия между вызовами _cdecl и _stdcall довольно тонкие. При стандартном вызове вызываемая функция очищает стек, поэтому она должна точно "знать" количество ожидаемых параметров. В связи с этим функция стандартного вызова не может иметь переменного числа аргументов (как, например, printf). Поскольку для функций _cdeci стек очищает вызывающая программа, функции с переменным числом аргументов допустимы. Стандартный вызов используется по умолчанию для системных функций Win32, а также для функций языка Visual Basic.

Таблица 6.3. Соглашения о вызовах

Соглашение о вызове

Передача параметров

Поддержка стека

Декорирование имен

Замечания

_cdecl

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

Аргументы из стека удаляет вызывающая программа. Это единственное соглашение о вызовах, которое допускает переменные списки аргументов

Символ подчеркивания в качестве префикса перед именами функций, как в_Роо

Используется по умолчанию для функций С и C++

_ stdcall

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

Свои собственные аргументы из стека удаляет сама вызванная функция

Символ подчеркивания в качестве префикса перед именами функций и суффикс @ , за которым следует десятичное число байт в списке аргументов, как в_Роо@12

Используется почти всеми системными функциями и, по умолчанию, внутренними функциями Visual Basic

_ fastcall

Два первых DWORD-параметра передаются в регистрах ЕСХ и EDX; остальные передаются справа налево

Аргументы из стека удаляет вызывающая функция

Префикс @ перед именем и суффикс @ после него, за которым следует десятичное число байт в списке аргументов, как в ®Foo@12

Применяется только в Intel CPU. Это соглашение о вызовах используется по умолчанию для компиляторов Borland Delphi

this

Справа налево. Параметр this передается в регистре ЕСХ

Аргументы из стека удаляет вызывающая функция

Нет

Используется автомат-ски методами классов C++, если не указан стандартный вызов. Все СОМ-методы объявляются со стандартным вызовом




Начало  Назад  Вперед