Компиляция этой простой функции с MSVC2008, в Режиме отладки:
int __cdecl sum(int a, int b)
{
return a + b;
}
Я получаю следующий список дизассемблирования:
int __cdecl sum(int a, int b)
{
004113B0 push ebp
004113B1 mov ebp,esp
004113B3 sub esp,0C0h
004113B9 push ebx
004113BA push esi
004113BB push edi
004113BC lea edi,[ebp-0C0h]
004113C2 mov ecx,30h
004113C7 mov eax,0CCCCCCCCh
004113CC rep stos dword ptr es:[edi]
return a + b;
004113CE mov eax,dword ptr [a]
004113D1 add eax,dword ptr [b]
}
004113D4 pop edi
004113D5 pop esi
004113D6 pop ebx
004113D7 mov esp,ebp
004113D9 pop ebp
004113DA ret
Существуют некоторые части пролога, который я не понимаю:
004113BC lea edi,[ebp-0C0h]
004113C2 mov ecx,30h
004113C7 mov eax,0CCCCCCCCh
004113CC rep stos dword ptr es:[edi]
Почему это требуется?
Править:
После удаления /RTC
параметр компилятора, как был предложен, большая часть этого кода действительно, ушел. То, что осталось:
int __cdecl sum(int a, int b)
{
00411270 push ebp
00411271 mov ebp,esp
00411273 sub esp,40h
00411276 push ebx
00411277 push esi
00411278 push edi
return a + b;
00411279 mov eax,dword ptr [a]
0041127C add eax,dword ptr [b]
}
Теперь, почему: sub esp, 40h
необходимый? Это - как будто место выделяется для локальных переменных, хотя нет никого. Почему компилятор делает это? Там другой флаг включен?
Этот код излучается из-за параметра компиляции / RTC . Он инициализирует все локальные переменные в вашей функции на битовый шаблон, который очень может генерировать нарушение доступа или вызывать необычные выходные значения. Это помогает вам узнать, когда вы забыли инициализировать переменную.
Дополнительное пространство в кадре стека, которую вы видите, выделен, предназначен для поддержки функции редактирования + продолжения. Это пространство будет использоваться при редактировании функции при отладке и добавлении дополнительных локальных переменных. Измените опцию / zi на / zi, чтобы отключить его.
и в любом случае переполнения буфера (если вы перезаписываете локальные переменные), вы закончите в поле «int 3» OPCodes:
int 3 ; 0xCC
int 3 ; 0xCC
int 3 ; 0xCC
int 3 ; 0xCC
int 3 ; 0xCC
int 3 ; 0xCC
...
, которые могут быть заложными отладчиком, так что вы можете исправить свой код