现在的位置: 首页 > 综合 > 正文

帧指针和栈指针

2014年08月08日 ⁄ 综合 ⁄ 共 625字 ⁄ 字号 评论关闭

原来帧指针指向的也是栈,不过是一个故事的开始。

而栈指针是一个故事的当下。

那帧指针为啥叫ebp,难道b==base。因为帧指针也叫基址指针。

帧指针使得访问函数的参数很容易。

所以任何函数调用进来的第一件事都是保护调用者的帧指针,以使得返回时可以恢复调用者的帧指针。

------------------------------

函数调用的故事

1.各种参数入栈

2.返回地址入栈,这个是用当前指令地址++当作返回地址的

3.调用者的帧指针入栈保护(本次调用的基址指针就指向这里)

4.调用者的寄存器入栈保护

5.被调用的函数的局部变量的分配

依cpu不同会有细小的差别

 

函数调用时的内存布局:

|-----参数----------|

|---返回地址--------|

|----旧的ebp--------| 新的ebp就会指向这里

|---保存的寄存器状态|

|--本地变量---------|

所以当前ebp-4就是返回地址,当前ebp-8就是调用传来的参数。

 ----------------------------

堆是可以建立很多个的,但是每个堆是有最大尺寸限制的。

内存有5种,堆,栈,静态,常量,代码

全局变量和静态变量都在静态内存里。

常量字符串都在常量区里。

--------------------------------

缓冲区溢出对栈的破坏是显而易见的,栈上的缓冲区溢出可以覆盖返回地址,被恶意代码攻击,也就谁说栈的缓冲区溢出很容易被利用,那么堆上的缓冲区溢出危险不危险?

抱歉!评论已关闭.