ebp栈底指针(寄存器)esp栈顶指针(寄存器)
栈底指针(ebp)-偏移表示地址
1、函数调用先压实参(从右向左支持可变参),通过(栈底指针-偏移)把实参移到寄存器(eax、ecx)再压入栈
2、(call指令)先把当前栈帧下一行指令地址入栈,再跳转。
入栈过程:
1、把调用方栈底指针(ebp)压入当前栈顶,再把调用方栈底指针(ebp)向当前栈顶指针(esp);
2、栈顶指针上移(esp-X)开辟空间;寄存器(ebx、esi、edi)入栈;把(esp)放入(edi)中;把X/4放入(ecx)中;把(0xCCCCCCCC)放入(eax)中;
3、Rep stor循环使用(0xCCCCCCC)初始化开辟空间
总结:
1、把当调用方栈底指针入栈作为当前栈底,并把主调方栈顶指向当前栈底;
2、为当前栈帧开辟空间,保存响应寄存器;
2、循环初始化已开辟的空间。
回退过程:
1、栈顶指针(esp)回退到当前栈底(ebp);
2、(pop ebp)栈顶出栈把值赋给栈底指针(ebp),即ebp指向调用方栈底;
3、ret指令 栈顶(call指令的下一行地址)出栈放入PC寄存器
汇编片段:
Push ebp //把调用方栈底指针(ebp)压入当前栈顶
Move ebp,esp //esp值赋给ebp即ebp拉倒栈顶
Sub esp,4CH //为当前函数开辟栈帧
//Ebx、esi、edi
Rep stos ebp-esp 0xCCCCCCC //初始化栈帧
Move esp、ebp //ebp值赋给esp即esp拉回栈底
Pop ebp //栈顶元素出栈把值赋给ebp,即ebp指向调用方栈底
Ret //栈顶(call指令的下一行地址)出栈放入PC寄存器