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?
Sembra una spiegazione, ma la funzione non ha variabili locali! –
per favore vedi la mia modifica della domanda –
Ho aggiornato la mia risposta, sotto la linea. –