Ce qui est entre ESP et EBP?
Droit, je suis sûr que c'est implicitement répondu à plusieurs reprises, mais je ne semblent pas être en mesure d'obtenir assez de lui.
Si vous avez un (x86) trace de la pile (dire, en le regardant dans WinDbg), et vous regardez les registres, ce qui signifie pour EBP et ESP valeurs de x octets à part?
Liens:
- https://stackoverflow.com/a/3699916/321013
- https://stackoverflow.com/a/2466587/321013
- https://stackoverflow.com/a/5738940/321013
Pour donner un exemple récent d'une trace de la pile que j'avais:
0:016> k
ChildEBP RetAddr
1ac5ee8c 76b831bb ntdll!NtDelayExecution+0x15
1ac5eef4 76b83a8b KERNELBASE!SleepEx+0x65
1ac5ef04 0060e848 KERNELBASE!Sleep+0xf
1ac5ef10 76859d77 MyApp!application_crash::CommonUnhandledExceptionFilter+0x48 [...\applicationcrash.inc.cpp @ 47]
1ac5ef98 775a0df7 kernel32!UnhandledExceptionFilter+0x127
1ac5efa0 775a0cd4 ntdll!__RtlUserThreadStart+0x62
1ac5efb4 775a0b71 ntdll!_EH4_CallFilterFunc+0x12
1ac5efdc 77576ac9 ntdll!_except_handler4+0x8e
1ac5f000 77576a9b ntdll!ExecuteHandler2+0x26
1ac5f0b0 7754010f ntdll!ExecuteHandler+0x24
1ac5f0b0 6e8858bb ntdll!KiUserExceptionDispatcher+0xf
1ac5f400 74e68ed7 mfc80u!ATL::CSimpleStringT<wchar_t,1>::GetString [f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h @ 548]
1ac5fec0 6e8c818e msvcr80!_NLG_Return [F:\dd\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm @ 73]
1ac5ff48 74e429bb mfc80u!_AfxThreadEntry+0xf2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 109]
1ac5ff80 74e42a47 msvcr80!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
1ac5ff88 76833677 msvcr80!_threadstartex+0x66 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
1ac5ff94 77569f02 kernel32!BaseThreadInitThunk+0xe
1ac5ffd4 77569ed5 ntdll!__RtlUserThreadStart+0x70
1ac5ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
0:016> r
eax=00000000 ebx=1ac5efc8 ecx=19850614 edx=00000000 esi=1ac5eed0 edi=00000000
eip=7754fd21 esp=1ac5ee8c ebp=1ac5eef4 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
Valeurs de l'ESP 1ac5ee8c
- EBP 1ac5eef4
= 104 octets différence. Alors, quel est il?
Vous devez vous connecter pour publier un commentaire.
ESP est le pointeur de pile actuel. EBP est le pointeur de la base de l'actuel cadre de pile.
Lorsque vous appelez une fonction, généralement un espace est réservé sur la pile pour les variables locales. Cet espace est généralement référencé via EBP (toutes les variables locales et les paramètres de la fonction sont connus décalage constant de ce registre, pour la durée de l'appel de la fonction.) ESP, d'autre part, vont changer lors de l'appel de fonction comme les autres fonctions sont appelées, ou à titre temporaire de l'espace de pile est utilisé pour le fonctionnement partiel des résultats.
Noter que la plupart des compilateurs de ces jours, ont une option de référence, toutes les variables locales par le biais de l'ESP. Cela libère de EBP pour l'utiliser comme un registre.
En général, quand vous regardez le démontage, le code en haut d'une fonction que vous verrez quelque chose comme ceci:
Donc EBP pointe vers le haut de votre pile de ce cadre, et l'ESP va point à la prochaine octets sur la pile. (Les piles généralement - mais ne pas avoir à pousser vers le bas dans la mémoire.)
SleepEx
niNtDelayExecution
unpush EBP
et surtoutSleepEx
semble être non trivial. Donc, dans mon exemple, le EBP pointe toujours vers leSleep
emplacement de pile, avec tous les trucs de deux fonctions appelées également sur la pile.some_number
? Ne pas toujours être à 0?Généralement, cet espace est réservé pour les variables locales qui finissent stockés dans la pile. Au début de la fonction,
ESP
est décrémenté par la valeur appropriée.Dans votre cas, il y a 104 octets valeur de la population locale dans la fonction.
NtDelayExecution()
alloue une chaîne de tampon sur la pile pour une raison quelconque.SleepEx
ni NtDelayExecution unpush EBP
et surtoutSleepEx
semble être non trivial. Donc, dans mon exemple, le EBP pointe toujours vers leSleep
emplacement de pile.