0


EBP与ESP的作用

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, 恢复进入函数前的堆栈.

}

标签:

本文转载自: https://blog.csdn.net/qq_41943585/article/details/119732221
版权归原作者 catdeo 所有, 如有侵权,请联系我们删除。

“EBP与ESP的作用”的评论:

还没有评论