EBP与ESP的作用
EBP是当前函数的存取指针,就是存储或读取函数中变量的指针基地址。ESP就是当前函数的栈顶指针。每一次发生函数调用的时候,在被call func初始化的时候都会把当前函数的EBP入栈,保证在子函数返回到主函数的时候能够找到栈帧基地址EBP
假设某一个main函数调用某一个test(int a,int b)函数
假设此时的main函数的ESP指针已经指向了0X896FFFAA,EBP为0x896FFFFFF
push a; 完成参数a的压栈,ESP = 0X896FFFAA - 4 = 0X896FFFA6
push b; 完成参数b的压栈,ESP = 0X896FFFAA - 8 = 0X896FFFA2
call test; 完成test函数返回地址的压栈,ESP = 0X896FFFAA - 0XC = 0X896FFF9D
{
push ebp ; 保护先前的EBP指针,就是把main函数基地址0x896FFFFFF入栈,此时的ESP为0x896FFFF99
mov ebp ,esp; 设置ebp的指针指向栈顶0x896FFFF99,这个0x896FFFF99 EBP就是当前tast函数的栈帧基地址
mov eax , dword ptr [ebp + 0xc] ; ebp+0xc 就是参数a保存的地址
mov eax , dword ptr [ebp + 0x8] ; ebp+0x8 就是参数b保存的地址
sub esp,8; 给函数的局部变量开辟栈空间,此时的esp继续减小 = 0x896FFFF91
…
add esp ,8 ; 销毁局部变量,esp += 8, = 0x896FFFF99
pop ebp; 出栈,恢复EBP,ESP+=4, = 0x896FFFF9D
ret 8; ret返回,弹出返回地址,ESP+=4, ESP= 0X896FFFA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP= 0X896FFFAA, 恢复进入函数前的堆栈.
}
版权归原作者 catdeo 所有, 如有侵权,请联系我们删除。