Что обозначают __cdecl, __fastcall, и __stdcall?
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 24.12.02 07:50
Оценка:
Что значат __cdecl, __fastcall, и __stdcall специфики функций?
Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?

А то чтото MSDN очень лаконичен.
:: Into my SONY MDR-R10 sound "Nine Inch Nails — Starfuckers Inc. (D. Ogilvie mix)" ::
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
От: Atilla Россия  
Дата: 24.12.02 07:58
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций?

LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?

LF>А то чтото MSDN очень лаконичен.


... << RSDN@Home 1.0 beta 3 >>
Кр-ть — с.т.
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
От: Снорк  
Дата: 24.12.02 07:59
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций?

LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?

LF>А то чтото MSDN очень лаконичен.


Эти спецификаторы определяют порядок следования аргументов на стеке и сторону, которая стек очищает (caller или callee).
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
От: Bell Россия  
Дата: 24.12.02 08:04
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций?

LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?

LF>А то чтото MSDN очень лаконичен.


LF>


Это есть так называемые calling convention, т.е. способы вызова функций (вернее способ передачи параметров):
как известно, перед вызовом функции ее параметры складываются в стэк
__cdecl — после вызова функции параметры из стэка удаляет вызывающая сторона
__stdcall — после вызова функции параметры из стэка удаляет сама эта функция
__fastcall — похожа на __stdcall, но часть параметров пытается передать через регистры.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Что обозначают __cdecl, __fastcall, и __stdcall?
От: Atilla Россия  
Дата: 24.12.02 08:06
Оценка:
Здравствуйте, Atilla, Вы писали:


A>

Ой.. это я с extern "C" спутал на самом деле __cdecl — это С-шный порядок аргументов по-умолчанию.
... << RSDN@Home 1.0 beta 3 >>
Кр-ть — с.т.
Re[2]: Что обозначают __cdecl, __fastcall, и __stdcall?
От: Кодт Россия  
Дата: 24.12.02 09:36
Оценка: 20 (4)
Здравствуйте, Atilla, Вы писали:

A>

Неточно!
; F(A,B,C,D)

_cdecl: ; прямой порядок расположения данных на стеке
        ; обратный по времени способ запихивания
        ; допускает переменное число параметров
        ; поскольку стек очищает тот, кто вызвал функцию
  push D
  push C
  push B
  push A
  call F
  ; ret
  inc esp, 16  ; очистка стека здесь

_stdcall: ; порядок данных - тот же самый
          ; но стек очищает функция
          ; поэтому число параметров фиксировано
  push D
  push C
  push B
  push A
  call F
  ; ret 16 ; очистка стека - в функции

_fastcall: ; аналогично stdcall, но два первых параметра передаются через регистры
  push D
  push C
  mov edx, B
  mov eax, A
  call F
  ; ret 8 ; очистка стека - в функции

_pascal: ; обратный порядок данных на стеке, прямой порядок запихивания
         ; поэтому число параметров фиксировано, и следовательно, стек очищает функция
  push A
  push B
  push C
  push D
  call F
  ; ret 16
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.