2010-01-16 13 views
6

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?

Respuesta

11

Este código se emite debido a /RTC compile option. Inicializa todas las variables locales en su función a un patrón de bits que es altamente probable que genere una violación de acceso o que cause valores de salida inusuales. Eso te ayuda a descubrir cuándo olvidaste inicializar una variable.


El espacio adicional en el marco de pila que ve asignado está allí para admitir la función Editar + Continuar. Este espacio se usará cuando edite la función durante la depuración y agregue más variables locales. Cambie la opción/ZI a/Zi para deshabilitarla.

+0

Eso suena como una explicación, ¡pero la función no tiene variables locales! –

+0

por favor vea mi edición de la pregunta –

+0

Actualicé mi respuesta, debajo de la línea. –

3

y en todo caso de desbordamiento de búfer (si desea sobrescribir las variables locales) que va a terminar en un campo de "int 3" códigos de operación:

int 3 ; 0xCC 
int 3 ; 0xCC 
int 3 ; 0xCC 
int 3 ; 0xCC 
int 3 ; 0xCC 
int 3 ; 0xCC 
... 

que puede ser atrapado por el depurador, por lo que puede arreglar su código

+1

INT 3 es la trampa del depurador, pero debe ser ejecutada por la CPU para ingresarla realmente, ¿no es así? Si me limito a pisotearlo sin ejecutarlo, no importa que sea INT 3, ¿o lo estoy malinterpretando? –

+0

@Bartosz, vea mi edición de la pregunta –

Cuestiones relacionadas