2010-01-16 8 views
6

Compilazione questa semplice funzione con MSVC2008, in modalità debug:Capire il prologo funzione di chiamata C con __cdecl sulle finestre

int __cdecl sum(int a, int b) 
{ 
    return a + b; 
} 

ottengo una lista di smontaggio:

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 

ci sono alcune parti del il prologo non capisco:

004113BC lea   edi,[ebp-0C0h] 
004113C2 mov   ecx,30h 
004113C7 mov   eax,0CCCCCCCCh 
004113CC rep stos dword ptr es:[edi] 

Perché è necessario?


EDIT:

Dopo aver rimosso l'opzione /RTC compilatore, come è stato suggerito, la maggior parte di questo codice infatti è andato via. Che cosa è rimasto è:

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] 
} 

Ora, perché è il: sub esp, 40h necessario? È come se il posto venisse allocato per le variabili locali, sebbene non ce ne siano. Perché il compilatore sta facendo questo? C'è un'altra bandiera coinvolta?

risposta

11

Questo codice viene emesso a causa dello /RTC compile option. Inizializza tutte le variabili locali della funzione su un pattern di bit che è altamente probabile generare una violazione di accesso o causare valori di output insoliti. Questo ti aiuta a scoprire quando hai dimenticato di inizializzare una variabile.


Lo spazio aggiuntivo nel frame di stack che viene visualizzato è disponibile per supportare la funzione Modifica + Continua. Questo spazio verrà utilizzato quando si modifica la funzione durante il debug e si aggiungono più variabili locali. Cambia l'opzione/ZI in/Zi per disabilitarla.

+0

Sembra una spiegazione, ma la funzione non ha variabili locali! –

+0

per favore vedi la mia modifica della domanda –

+0

Ho aggiornato la mia risposta, sotto la linea. –

3

e in ogni caso di overflow del buffer (se si desidera sovrascrivere le variabili locali) vi ritroverete in un campo di "int 3" codici operativi:

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

che può essere catturato dal debugger, in modo da puoi risolvere il tuo codice

+1

INT 3 è il trap del debugger, ma deve essere eseguito dalla CPU per inserirlo davvero, vero? Se mi limito a calpestarlo senza eseguirlo, non importa che sia INT 3 - o lo sto fraintendendo? –

+0

@Bartosz, per favore vedi la mia modifica della domanda –

Problemi correlati