ESP:扩展堆栈指针,永远指向栈顶。

EBP:基址指针(Base Pointer),用它可直接存取堆栈中的数据。EBP寄存器在调用函数时保存ESP,使函数结束时可以正确返回。

当发生函数调用的时候,栈空间存放数据安排如下(假设函数A调用函数B):

1、A把B所需要的参数按照与B的形参顺序相反的次序压入栈中,即:从右向左依次把B所需要的参数压入栈;

2、A使用call指令调用B,并把call指令的下一条指令的地址当成返回地址压入栈中(这个压栈操作隐含在call指令中);

3、在执行B时,B会先保存A的入口地址(push ebp),然后再将自己的入口地址设置为当前栈顶地址(mov ebp,esp);

4、在B中,从ebp的位置处开始存放被调函数中的局部变量和临时变量,并且这些变量的地址按照定义时的顺序依次减小,即:这些变量的地址是按照栈的延伸方向排列的,先定义的变量先入栈,后定义的变量后入栈;

5、B执行结束后进行以下操作:

(1)把函数的返回值存放在通用寄存器eax中,供外部使用

(2)把esp指向函数开始执行的位置, 即mov esp,ebp;

(3)将A的入口地址从栈中弹出, 存放到ebp中,即pop ebp;

(4)ret指令从栈中弹出返回地址,并且将控制转移到该位置。

wKioL1OYUq_iiHCUAAAnhRFmkZA928.gif