关于栈帧

来源:互联网 发布:电脑端口怎么关闭 编辑:程序博客网 时间:2024/05/25 23:57

每个函数调用的时候都有自己独立的一块栈帧,这个栈帧中维持着各种各样的信息。寄存器esp指向当前栈帧的顶部,也就是低地址。所以我们需要想象的是一个很长的木头,木头被编了号码,esp则指向了号码较低的区域。        所以可以想象每个函数都有它自己的那一块木头,这时候问题来了,如果一个函数中有调用别的函数时怎么办,这需要从一个木头跳到另外一块木头,比如

main函数的栈帧也即是它的木头处。让被调用函数的参数压栈,然后调用该函数,使用

mov ebp,esp

ebp入栈,实际上是让main函数的栈顶却不需要保存,因为,这个栈顶跟新函数栈帧的底部刚好相邻。这时的栈帧如图:

如图:

func函数返回时,我们执行pop   ebp。这样ebp,再弹出返回地址到espmain函数的栈帧。         所以理解这个的关键点就在于,理解新的栈帧建立的这个过程。新的栈帧地址是怎么产生的?就是sub esp

ebp我们可以理解成一个段的基地址,也就是一个栈中地址最高的地方,指向栈底部,至于这个段是神马?可以想象成每个函数都有自己的一个,也就是有自己的一个esp,而当一个函数调用另外一个函数的时候,我们需要从自己的段跳到别的函数的段,所以跳转之前,必须保存好自己的段的基地址,也就是push ebp最后都有一个ebp的不会变化,而esp记录了当前函数执行到跳转之前的情况,eip压栈。这样等别的函数返回之后,保存的ebp的值会帮祝我们自己的段里继续执行下面的指令。

http://blog.csdn.net/yxysdcl/article/details/5569351

http://www.yuanma.org/data/2009/0401/article_3599.htm

http://hi.baidu.com/lyricidyll/blog/item/dc8ff8fbe8ce71879e5146fe.html这个有更详细的讲解

http://www.yuanma.org/data/2009/0401/article_3599.htm