compilar esta función simple con MSVC2008, en modo de depuración:Comprender el prólogo llamada a la función C con __cdecl en las ventanas
int __cdecl sum(int a, int b)
{
return a + b;
}
me sale el siguiente listado de desmontaje:
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
hay algunas partes de el prólogo no entiendo:
004113BC lea edi,[ebp-0C0h]
004113C2 mov ecx,30h
004113C7 mov eax,0CCCCCCCCh
004113CC rep stos dword ptr es:[edi]
¿Por qué es necesario?
EDIT:
Después de quitar la opción /RTC
compilador, como se ha sugerido, la mayor parte de este código de hecho fue. Lo que quedó es:
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]
}
Ahora, ¿por qué es necesario: sub esp, 40h
? Es como si el lugar se estuviera asignando a variables locales, aunque no hay ninguna. ¿Por qué el compilador está haciendo esto? ¿Hay otra bandera involucrada?
Eso suena como una explicación, ¡pero la función no tiene variables locales! –
por favor vea mi edición de la pregunta –
Actualicé mi respuesta, debajo de la línea. –