当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 举例说明EIP,EBP,ESP的作用

举例说明EIP,EBP,ESP的作用

2019年04月19日  | 移动技术网IT编程  | 我要评论

疯狂主妇大采购5,广州哪里有鸡叫,香港天颂航空公司

eip,ebp,esp都是的寄存器,里面存的都是些地址。
 为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。
 我们dc上讲过栈的数据结构,主要有以下特点:
 后进先处。
其实它还有以下两个作用:
 
 1.栈是用来存储临时变量,函数传递的中间结果。
 2.操作系统维护的,对于程序员是透明的。
我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。
先写个小程序:
void fun(void)
{
   printf("hello world");
}
void main(void)
{
  fun()
  printf("函数调用结束");
}
这是一个再简单不过的函数调用的例子了。
当程序进行函数调用的时候,我们经常说的是先将函数压栈,当函数调用结束后,再出栈。这一切的工作都是系统帮我们自动完成的。
但在完成的过程中,系统会用到下面三种寄存器:
1.eip
2.esp
3.ebp
当调用fun函数开始时,三者的作用。
1.eip寄存器里存储的是cpu下次要执行的指令的地址。
 也就是调用完fun函数后,让cpu知道应该执行main函数中的printf("函数调用结束")语句了。
2.ebp寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由esp传递给ebp的。(在函数调用前你可以这么理解:esp存储的是栈顶地址,也是栈底地址。)
3.esp寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。
 
当调用fun函数结束后,三者的作用:
1.系统根据eip寄存器里存储的地址,cpu就能够知道函数调用完,下一步应该做什么,也就是应该执行main函数中的printf(“函数调用结束”)。
2.ebp寄存器存储的是栈底地址,而这个地址是由esp在函数调用前传递给ebp的。等到调用结束,ebp会把其地址再次传回给esp。所以esp又一次指向了函数调用结束后,栈顶的地址。
其实我们对这个只需要知道三个指针是什么就可以,可能对我们以后学习栈溢出的问题以及看栈这方面的书籍有些帮助。当有人再给你说eip,esp,ebp的时候,你不能一头雾水,那你水平就显得洼了许多。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网