webentwicklung-frage-antwort-db.com.de

Was ist zwischen ESP und EBP?

Richtig, ich bin mir sicher, dass dies oft implizit beantwortet wird, aber ich scheine nicht in der Lage zu sein, es wirklich zu verstehen.

Was bedeutet es für EBP und ESP Werte, die x Bytes voneinander entfernt sind?

Links:

Um ein Beispiel für einen kürzlich durchgeführten Stack-Trace zu geben:

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

Werte von ESP 1ac5ee8c - EBP 1ac5eef4 = 104 Byte Unterschied. Also, was ist da drin?

27
Martin Ba

ESP ist der aktuelle Stapelzeiger. EBP ist der Basiszeiger für den aktuellen Stapelrahmen.

Wenn Sie eine Funktion aufrufen, wird in der Regel Speicherplatz für lokale Variablen auf dem Stapel reserviert. Dieser Space wird normalerweise über EBP referenziert (alle lokalen Variablen und Funktionsparameter sind ein bekannter konstanter Offset von diesem Register für die Dauer des Funktionsaufrufs.) ESP ändert sich hingegen während des Funktionsaufrufs, wenn andere Funktionen aufgerufen werden. oder als temporärer Stapelplatz für Teiloperationsergebnisse verwendet wird.

Beachten Sie, dass die meisten Compiler heutzutage die Option haben, alle lokalen Variablen über ESP zu referenzieren. Dadurch wird EBP für die Verwendung als Allzweckregister freigegeben.

Wenn Sie sich den Disassembly-Code oben in einer Funktion ansehen, sehen Sie im Allgemeinen Folgendes:

Push EBP
mov  EBP, ESP
sub  ESP, <some_number>

Das heißt, EBP zeigt für diesen Frame auf den Anfang Ihres Stapels und ESP zeigt auf das nächste verfügbare Byte auf dem Stapel. (Stacks wachsen normalerweise - müssen aber nicht - hinein Erinnerung.)

71
user420442

Normalerweise ist dieser Speicherplatz für lokale Variablen reserviert, die auf dem Stapel gespeichert werden. Zu Beginn der Funktion wird ESP um den entsprechenden Wert dekrementiert.

In Ihrem Fall gibt es 104 Bytes an Einheimischen in der Funktion.

1