被调函数调用前的准备:
1)主调函数把被调函数的参数由右到左依次压栈
2)把CALL指令的下一条指令的地址(亦即:返回地址)压栈,同时把EIP修改为被调函数的首地址(通过CALL指令)。
被调函数执行时:
1)把EBP压入堆栈(PUSH EBP)。
3)使EBP指向堆栈中原EBP的值(MOV EBP, ESP)。
3)为被调函数开辟空间(SUB ESB,xxx)。
被调函数执行后:
1)回收开辟的空间 (MOV ESP, EBP),此时ESP等于EBP。
2)恢复EBP(POP EBP)。
3) 执行CALL指令的下一条指令(RET)。
4)平衡堆栈(ADD ESP,xxx ,亦即回收参数空间)。
---------------------------------------------------------------------------------
其中,如下三条指令:
PUSH EBP
MOV EBP, ESP
SUB ESP, 立即数
可由一条ENTER指令代替
ENTER 立即数, 0
---------------------------------------------------------------------------------
EBP - 4 开始是局部变量
*********EBP + 4 是返回地址*********
EBP + 8 开始是函数参数