ebp 函数堆栈esp_对于ESP、EBP寄存器的理解

ESP是栈指针,随着函数调用动态变化,而EBP用于保存进入函数时的ESP值,方便访问参数和局部变量。EBP的存在简化了程序员的工作,便于调试。文章通过实例解析了_x86_处理器中堆栈参数传递的过程,包括STDCALL和C调用规范的差异。
摘要由CSDN通过智能技术生成

esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;

ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;

既然使用esp也可以,那么为什么要设定ebp呢?

答案是为了方便程序员。

因为esp在函数运行时会不断的变化,所以保存一个一进入某个函数的esp到ebp中会方便程序员访问参数和局部变量,而且还方便调试器分析函数调用过程中的堆栈情况。前面说了,这个ebp不是必须要有的,你非要使用esp来访问函数参数和局部变量也是可行的,只不过这样会麻烦一些。

这里函数调用约定使用的是_stdcall

通过一段程序理解esp和ebp:

main() {//执行test前

print(int p1,intp2);//执行test后

}

分析下上面程序的调用原理,假设执行print前esp=Q:

push p2;//函数参数p2入栈,esp=Q-4H

push p1;//函数参数p1入栈,esp=Q-8H

call print;//函数返回地址入栈,esp=Q-0CH

//现在进入print内,做些准备工作:push ebp;//保护先前ebp指针,ebp入栈,esp=Q-10H

mov ebp,esp;//设置ebp等于当前的esp

// 此时,ebp&#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值