What exactly is the base pointer and stack pointer? To what do they point?
assembly, c, stack-frame, stack-pointer, x86
Solution
`esp` is as you say it is, the top of the stack.
`ebp` is usually set to `esp` at the start of the function. Function parameters and local variables are accessed by adding and subtracting, respectively, a constant offset from `ebp`. All x86 calling conventions define `ebp` as being preserved across function calls. `ebp` itself actually points to the previous frame's base pointer, which enables stack walking in a debugger and viewing other frame's local variables to work.
Most function prologs look something like:
push ebp ; Preserve current frame pointer
mov ebp, esp ; Create new frame pointer pointing to current stack top
sub esp, 20 ; allocate 20 bytes worth of locals on stack.
Then later in the function you may have code like (presuming both local variables are 4 bytes)
mov [ebp-4], eax ; Store eax in first local
mov ebx, [ebp - 8] ; Load ebx from second local
FPO or frame pointer omission optimization which you can enable will actually eliminate this and use `ebp` as another register and access locals directly off of `esp`, but this makes debugging a bit more difficult since the debugger can no longer directly access the stack frames of earlier function calls.
EDIT:
For your updated question, the missing two entries in the stack are:
nShowCmd = dword ptr +14h
hlpCmdLine = dword ptr +10h
PrevInstance = dword ptr +0Ch
hInstance = dword ptr +08h
return address = dword ptr +04h <==
savedFramePointer = dword ptr +00h <==
var_4 = dword ptr -04h
var_8 = dword ptr -08h
var_C = dword ptr -0Ch
This is because the flow of the function call is:
- Push parameters (`hInstance`, `PrevInstance`, `hlpCmdLine`, `nShowCmd`)
- Call function, which pushes return address
- Push `ebp`
- Allocate space for locals
Problem
Using this example coming from Wikipedia, in which `DrawSquare()` calls `DrawLine()`: (Note that this diagram has high addresses at the bottom and low addresses at the top.) Could anyone explain to me what `ebp` and `esp` are in this context? From what I see, I'd say the stack pointer points always to the top of the stack, and the base pointer to the beginning of the current function? Right? edit: I mean this in the context of Windows programs. edit2: And how does `eip` work, too? edit3: I have the following code from MSVC++: ``` var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h ``` All of them seem to be dwords, thus taking 4 bytes each. So I can see there is a gap from `hInstance` to `var_4` of 4 bytes. What are they? I assume it is the return address, as can be seen in the diagram from Wikipedia. (editor's note: removed a long quote from Michael's answer, which doesn't belong in the question, but a followup question was edited in): This is because the flow of the function call is: - Push parameters (hInstance, etc.) - Call function, which pushes return address - Push ebp - Allocate space for locals My question (last one, I hope!) now is, what exactly happens from the instant I pop the arguments of the function I want to call up to the end of the prolog? I want to know how the ebp, esp evolve during those moments (I already understood how the prolog works, I just want to know what is happening after I pushed the arguments on the stack and before the prolog).