Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
#1

__cdecl and __stdcall - C++

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

Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2011, 22:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос __cdecl and __stdcall (C++):

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

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

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

Передача структуры данных в DLL (stdcall) - Delphi
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1: String) Поле2: "Циферный" тип, длинной...

Используя соглашение stdcall вызвать функцию на ассемблере - Assembler
надо используя соглашения stdcall вызвать функцию на ассемблере и используя соглашения cdecl и fastcall вызвать функции с программы на си ...

Правильный формат записи команды RET при использовании stdcall - Assembler
Здравствуйте! Имеется вопрос по процедурам. Если в самом начале кода написано: .386 .model flat,stdcall option casemap:none ...

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

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

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

Передача структуры данных в DLL (stdcall) - Delphi
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1: String) Поле2: "Циферный" тип, длинной...

Используя соглашение stdcall вызвать функцию на ассемблере - Assembler
надо используя соглашения stdcall вызвать функцию на ассемблере и используя соглашения cdecl и fastcall вызвать функции с программы на си ...

Правильный формат записи команды RET при использовании stdcall - Assembler
Здравствуйте! Имеется вопрос по процедурам. Если в самом начале кода написано: .386 .model flat,stdcall option casemap:none ...

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

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

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

Передача структуры данных в DLL (stdcall) - Delphi
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1: String)

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

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

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

Передача структуры данных в DLL (stdcall) - Delphi
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1: String) Поле2: "Циферный" тип, длинной...

Используя соглашение stdcall вызвать функцию на ассемблере - Assembler
надо используя соглашения stdcall вызвать функцию на ассемблере и используя соглашения cdecl и fastcall вызвать функции с программы на си ...

Правильный формат записи команды RET при использовании stdcall - Assembler
Здравствуйте! Имеется вопрос по процедурам. Если в самом начале кода написано: .386 .model flat,stdcall option casemap:none ...


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

Или воспользуйтесь поиском по форуму:
7
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
06.07.2011, 23:14 #2
http://ru.wikipedia.org/wiki/Соглашение_вызова
0
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
06.07.2011, 23:53  [ТС] #3
Ну да, я это все читал. Я не понимаю, или не полностью понимаю, что означает, в чем проявляется тот момент, какая функция (вызывающая или вызываемая) очищает стек. Где видно эту разницу и что это дает.
0
Nick Alte
Эксперт С++
1641 / 1013 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.07.2011, 00:13 #4
Разницу видно в дизассемблированном коде и в том, что функции __cdecl могут иметь переменное число параметров (как printf, например).
1
xAtom
915 / 740 / 60
Регистрация: 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
18264 / 6389 / 440
Регистрация: 30.03.2009
Сообщений: 17,674
Записей в блоге: 28
07.07.2011, 15:12 #6
Цитата Сообщение от Alecs12 Посмотреть сообщение
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
Может это чем-то поможет
Реализация __stdcall, __cdecl
1
Alecs12
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
18264 / 6389 / 440
Регистрация: 30.03.2009
Сообщений: 17,674
Записей в блоге: 28
08.07.2011, 11:08 #8
Цитата Сообщение от Alecs12 Посмотреть сообщение
Но Вы там не писали про ту часть, что я не очень уразумел
Там я просто попытался ответить на вопрос (предположил) ЗАЧЕМ оно сделано. А в конкретике я всё равно тебе не отвечу, ибо в intel'овской системе команд не разбираюсь
0
08.07.2011, 11:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru