1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
|
|
1 | |
__cdecl and __stdcall06.07.2011, 22:25. Показов 6474. Ответов 7
Метки нет (Все метки)
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
0
|
06.07.2011, 22:25 | |
Ответы с готовыми решениями:
7
[variadic pack][cdecl] Передача дополнительного аргумента в функцию stdcall/cdecl? Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB Работа с TASM в С++, через cdecl |
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
06.07.2011, 23:14 | 2 |
0
|
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
|
|
06.07.2011, 23:53 [ТС] | 3 |
Ну да, я это все читал. Я не понимаю, или не полностью понимаю, что означает, в чем проявляется тот момент, какая функция (вызывающая или вызываемая) очищает стек. Где видно эту разницу и что это дает.
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
07.07.2011, 00:13 | 4 |
Разницу видно в дизассемблированном коде и в том, что функции __cdecl могут иметь переменное число параметров (как printf, например).
1
|
07.07.2011, 02:43 | 5 |
Да правильно, __cdecl очищает стек от параметров вызываемая программа add ESP, N - количество байт переданных процедуре.
__stdcall - процедура сама очищает ret N - кол-во байт, __fastcall - передача через регистры только два. Если процедура-функция вызывается многократна например на события таймера то нужно чтобы сама процедура за собой стек очищала вот почему все обработчики сообщений в WinApi декларируются как __stdcall макрос WINAPI.
1
|
07.07.2011, 15:12 | 6 |
1
|
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
|
|
07.07.2011, 23:50 [ТС] | 7 |
Т.е. при __cdecl функция, которую вызывает не имеет в своем ассемблерном коде ret? а при __stdcall имеет?
add ESP, N увеличивает указатель на вершину стека, это идет до вызова функции, потом вызов функции по__cdecl, потом в функции, что вызывала уменьшается ESP на N? Да, я это читал, очень хорошо написано, спасибо =) Но Вы там не писали про ту часть, что я не очень уразумел.
0
|
08.07.2011, 11:08 | 8 |
Там я просто попытался ответить на вопрос (предположил) ЗАЧЕМ оно сделано. А в конкретике я всё равно тебе не отвечу, ибо в intel'овской системе команд не разбираюсь
0
|
08.07.2011, 11:08 | |
08.07.2011, 11:08 | |
Помогаю со студенческими работами здесь
8
Синтаксическая ошибка stdcall Как правильно получить PAnsiChar из cdecl-функции Макрос для вызова подпрограмм с соглашением cdecl Конфликт forward и stdcall в dll-библиотеке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |