寄存器与函数栈帧之整理篇


       转载自:点击打开链接http://blog.csdn.net/PenglueR/article/details/5203738


       

每个任务(进程)有一个栈,在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为帧(frame)。%esp寄存器指向当前整个栈的栈顶,% ebp指向当前帧的帧底。上一级调用者的帧底被压入当前%ebp内容所指的地址,也就是当前帧的帧底位置保存了 上一级调用者的%ebp指针值(帧底),而每个%ebp的前一个单元存放的就是当前函数的返回地址(它是由调用者在call指令中入的栈),保证是在上以 及帧的最后一个空间单元。这样就可以
根据当前%ebp的值回溯出整个任务的调用栈(调用过程)。

在函数栈帧中,一般包含以下几类重要信息。
(1)局部变量:为函数局部变量开辟的内存空间。
(2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过栈帧平衡计
算得到),用于在本栈被弹出后恢复出上一个栈帧。
(3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回
时能够恢复到函数被调用前的代码区中继续执行指令。
注:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是
在不停变化的。
除了与栈相关的寄存器外,我们还需要记住另一个至关重要的寄存器。
EIP:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待
执行的指令地址,其作用可参考【指令寄存器EIP的作用(图2)】来理解。
可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值