Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
1

__cdecl and __stdcall

06.07.2011, 22:25. Показов 6474. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2011, 22:25
Ответы с готовыми решениями:

[variadic pack][cdecl]
доброе утро. рассмотрим код: http://rextester.com/ATJJT68666 #include <iostream>

Передача дополнительного аргумента в функцию stdcall/cdecl?
Всем доброго дня! Есть функция func вида: __stdcall void func() { cout<<"func"<<endl;...

Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB
Добрый день. А как обнаружить свой адрес при входе в функцию какой-либо DLL-ки ? А по русски...

Работа с TASM в С++, через cdecl
Нужно написать функцию strcat на АСМе, при этом писать в MSVS 2008 сишный код с вызовом АСМа через...

7
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
06.07.2011, 23:14 2
http://ru.wikipedia.org/wiki/Соглашение_вызова
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
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
07.07.2011, 02:43 5
Да правильно, __cdecl очищает стек от параметров вызываемая программа add ESP, N - количество байт переданных процедуре.
__stdcall - процедура сама очищает ret N - кол-во байт, __fastcall - передача через регистры только два. Если процедура-функция вызывается многократна например на события таймера то нужно чтобы сама процедура за собой стек очищала вот почему все обработчики сообщений в WinApi декларируются как __stdcall макрос WINAPI.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.07.2011, 15:12 6
Цитата Сообщение от Alecs12 Посмотреть сообщение
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
Может это чем-то поможет
Реализация __stdcall, __cdecl
1
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
07.07.2011, 23:50  [ТС] 7
Цитата Сообщение от xAtom Посмотреть сообщение
Да правильно, __cdecl очищает стек от параметров вызываемая программа add ESP, N - количество байт переданных процедуре.
__stdcall - процедура сама очищает ret N - кол-во байт, __fastcall - передача через регистры только два. Если процедура-функция вызывается многократна например на события таймера то нужно чтобы сама процедура за собой стек очищала вот почему все обработчики сообщений в WinApi декларируются как __stdcall макрос WINAPI.
Т.е. при __cdecl функция, которую вызывает не имеет в своем ассемблерном коде ret? а при __stdcall имеет?
add ESP, N увеличивает указатель на вершину стека, это идет до вызова функции, потом вызов функции по__cdecl, потом в функции, что вызывала уменьшается ESP на N?

Цитата Сообщение от Evg Посмотреть сообщение
Может это чем-то поможет
Реализация __stdcall, __cdecl
Да, я это читал, очень хорошо написано, спасибо =) Но Вы там не писали про ту часть, что я не очень уразумел.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.07.2011, 11:08 8
Цитата Сообщение от Alecs12 Посмотреть сообщение
Но Вы там не писали про ту часть, что я не очень уразумел
Там я просто попытался ответить на вопрос (предположил) ЗАЧЕМ оно сделано. А в конкретике я всё равно тебе не отвечу, ибо в intel'овской системе команд не разбираюсь
0
08.07.2011, 11:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2011, 11:08
Помогаю со студенческими работами здесь

Синтаксическая ошибка stdcall
Добрый день. Помогите, пожалуйста решить проблему. В программе по нахождению неповторяющихся чисел...

Как правильно получить PAnsiChar из cdecl-функции
Добрый день. Есть функция из dll: function LoCase(CStr: PAnsiChar): PAnsiChar; cdecl; external...

Макрос для вызова подпрограмм с соглашением cdecl
как подключить в ассемблер Fasm соглашение вызова cdecl?

Конфликт forward и stdcall в dll-библиотеке
Добрый день. Есть некая библиотека library S_dll; uses ...; {$R *.res} var ... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru