首先 Unix系统中栈是由高地址向低地址生长。EBP永远指向基地址,ESP(活动)指向高地址。
EBP指向ESP的位置,(指向空栈,此时栈是空的,两者的位置相同)
之后ESP活动根据偏移量取得参数,推展栈生长(向低地址生长)
ESP越走越远,EBP原地待命,ESP碰到CALL调用此进程中的另一个方法(fun_A)
由ESP去推展fun_A,但是ESP一会还要回来,得有人放哨,所以...
在fun_A中EBP压栈并被保护,在fun_A入口位置等待
ESP推展fun_A的生长过程,直到运算做完,开始fun_A收尾工作
通用寄存器纷纷弹出栈
ESP指向EBP,回到入口处,
EBP弹出,ESP继续执行上一级调用函数,推进栈生长,直到结束
栈由高地址向低地址生长(栈底到栈顶)
堆由低地址向高地址生长,由于匿名,只能使用指针调用。
这也是EBP叫扩展基址指针寄存器的原因,有个误区说EBP永远指向栈底,这是不对的,因为:
ESP和EBP都是活动的,(ESP用于拓展),所谓的指向栈底只有相对每一个独立的方法来说才成立。
ESP用于生长,EBP用于固定位置,两者的关系和蚯蚓爬路一样(是啊,为什么我会想到如此恶心的比喻)
ESP是头,EBP是每次的支点 ,一步一步挪
原文地址:https://www.jb51.cc/bash/388346.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。