Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |
вопрос про соглашение __stdcall 22.10.01 04:18 Число просмотров: 954
Автор: ggg <ggg> Статус: Elderman
|
и правда логично было бы если функция вообще не меняла регистры (сохраняла, а потом восстанавливала)
наверно у меня просто компилятор оптимизировал код
он же знает какие регистры используются в вызывающей функции
скорее всего так и есть
если у кого появятся ещё какие соображения - пишите - интересно узнать
|
<programming>
|
вопрос про соглашение __stdcall 22.10.01 03:27
Автор: ggg <ggg> Статус: Elderman
|
какие регистры должны сохраняться ?
опытным путём получено, что достаточно восстанавливать esp и ebp
(достаточно что бы не глючило)
но при обычном вызове, который генерит VC60, так же сохраняются ebx, esi, edi
правда не уверен, что всегда
может кто знает как ДОЛЖНО быть ?
|
 |
вопрос про соглашение __stdcall 22.10.01 04:07
Автор: Heromantor Статус: Незарегистрированный пользователь
|
> какие регистры должны сохраняться ? > > опытным путём получено, что достаточно восстанавливать esp > и ebp > (достаточно что бы не глючило) > > но при обычном вызове, который генерит VC60, так же > сохраняются ebx, esi, edi > правда не уверен, что всегда > > может кто знает как ДОЛЖНО быть ?
StdCall Indicates that the __stdcall calling convention should be used for a method. The __stdcall calling convention is used to call Win32 API functions. Because the callee cleans the stack, the compiler changes the calling convention of vararg functions to __cdecl. Functions that use this calling convention require a function prototype.
А почему он сохраняет только 3 регистра? По-моему соглашения не должны влиять на общие регистры почему тогда он не сохраняет все регистры?
|
 |  |
вопрос про соглашение __stdcall 22.10.01 04:18
Автор: ggg <ggg> Статус: Elderman
|
и правда логично было бы если функция вообще не меняла регистры (сохраняла, а потом восстанавливала)
наверно у меня просто компилятор оптимизировал код
он же знает какие регистры используются в вызывающей функции
скорее всего так и есть
если у кого появятся ещё какие соображения - пишите - интересно узнать
|
 |  |  |
вопрос про соглашение __stdcall 22.10.01 06:41
Автор: NeuronViking Статус: Незарегистрированный пользователь
|
Конвенция передачи параметров(stdcall, cdecl, thiscall, fastcall, ... ) определяет ТОЛЬКО способ передачи параметров функции и ни чего более.
Сохранение/воостановление специфичных регистров зависит от конкретной ОС(хотя возможно еще и от компиллера какие-то дополнительные), эти регистры сохраняются для корректной работы кода под конкретной ОС. Так, например, в Windows(R) НЕЛЬЗЯ изменять(т.е. нужно сохранять значения) следующих регистров: ESI, EDI, EBX(особенно это относится к DLL), в зависимости от компилера и от настроек компилляции необходимо также сохранять регистр EDX. При выполнении этих условий программы будут работать корректно.
|
|
|