EBP寄存器存着什么东西,跟函数返回有什么联系啊

 我来答
百度网友f6753a1fd
2011-08-22 · TA获得超过821个赞
知道小有建树答主
回答量:294
采纳率:0%
帮助的人:363万
展开全部
进入函数时要保存ebp的值, 然后用来存放进入函数时esp的值,方便进行堆栈内的寻址, 函数返回要恢复ebp的值, 除此以外,ebp和函数返回没什么关系
====================================================================
在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值,达到堆栈平衡的目的。

应用以前说过的一段话:

原程序的OEP,通常是一开始以 Push EBP 和MOV Ebp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。

为什么要这样呢?为什么几乎每个程序都是的开头能?因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的:

1.让EBP保存ESP的值;

2.在结束的时候调用

mov esp,ebp
pop ebp
retn

或者是

leave
retn

两个形式是一个意思。
这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。
涌岛俊8
2011-08-22
知道答主
回答量:75
采纳率:0%
帮助的人:26.8万
展开全部
进入函数时要保存ebp的值, 然后用来存放进入函数时esp的值,方便进行堆栈内的寻址, 函数返回要恢复ebp的值, 除此以外,ebp和函数返回没什么关系
为什么要这样呢?为什么几乎每个程序都是的开头能?因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的:

1.让EBP保存ESP的值;

2.在结束的时候调用

mov esp,ebp
pop ebp
retn

两个形式是一个意思。
这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户24232
2011-08-22 · TA获得超过288个赞
知道小有建树答主
回答量:623
采纳率:50%
帮助的人:386万
展开全部
PASCAL是一种函数调用的方式,确定参数压栈的顺序,还有由谁来恢复堆栈,具体的可以看下下面的链接。还有这里:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式