Usando este exemplo, da wikipedia, no qual DrawSquare () chama DrawLine (),
(Observe que este diagrama tem endereços altos na parte inferior e endereços baixos na parte superior.)
Alguém poderia me explicar o que é ebp
e esp
neste contexto?
Pelo que vejo, eu diria que o ponteiro da pilha aponta sempre para o topo da pilha e o ponteiro base para o início da função atual? Ou o que?
editar: quero dizer isso no contexto de programas do Windows
edit2: E como eip
funciona também?
edit3: Eu tenho o seguinte código do 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
Todos eles parecem ser dwords, ocupando 4 bytes cada. Então eu posso ver que há uma diferença de hInstance para var_4 de 4 bytes. O que eles são? Presumo que seja o endereço de retorno, como pode ser visto na foto da wikipedia?
(nota do editor: removemos uma citação longa da resposta de Michael, que não pertence à pergunta, mas uma pergunta de acompanhamento foi editada em):
Isso ocorre porque o fluxo da chamada de função é:
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
Minha pergunta (por último, espero!) Agora é: o que é exatamente o que acontece desde o instante em que apareço os argumentos da função que quero chamar até o final do prólogo? Eu quero saber como o ebp, esp evolui durante esses momentos (eu já entendi como o prólogo funciona, eu só quero saber o que está acontecendo depois que eu empurrei os argumentos na pilha e antes do prólogo).