当调用一个函数时:

假设使用call前各个寄存器的位置如下 :

​ [eip]=0xaabbccdd

​ [esp]=0xffffaadd

​ [ebp]=0xffffbb00

1

使用时:call func :push eip :[esp]=[esp]-4

​ mov (esp),[eip]

​ push ebp: [esp]=[esp]-4

​ mov (esp),[ebp]

​ mov [esp],[ebp]

​ [esp]的位置随着函数的变化而变化

此时各个寄存器:

​ [ebp]=[esp-8]=0xffffaac5

​ (ebp)=0xffffbb00 就是ebp开始的位置

2

​ leave : mov esp,[ebp]

​ pop ebp : [ebp]=(esp)0xffffbb00 就是第二步存在栈上的地址

​ [esp]=[esp]+4

​ ret : pop eip:[eip]=(esp) 就是esp这个位置的栈上的值

​ [esp]=[esp]+4

此时各个寄存器:

​ [ebp]=0xffffbb00

​ [eip]=0xaabbccdd

3 [esp]=0xffffaabb