> какие регистры должны сохраняться ? > > опытным путём получено, что достаточно восстанавливать 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 регистра? По-моему соглашения не должны влиять на общие регистры почему тогда он не сохраняет все регистры?
вопрос про соглашение __stdcall22.10.01 04:18 Автор: ggg <ggg> Статус: Elderman
Конвенция передачи параметров(stdcall, cdecl, thiscall, fastcall, ... ) определяет ТОЛЬКО способ передачи параметров функции и ни чего более.
Сохранение/воостановление специфичных регистров зависит от конкретной ОС(хотя возможно еще и от компиллера какие-то дополнительные), эти регистры сохраняются для корректной работы кода под конкретной ОС. Так, например, в Windows(R) НЕЛЬЗЯ изменять(т.е. нужно сохранять значения) следующих регистров: ESI, EDI, EBX(особенно это относится к DLL), в зависимости от компилера и от настроек компилляции необходимо также сохранять регистр EDX. При выполнении этих условий программы будут работать корректно.