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

来源:互联网 发布:网络西西河 编辑:程序博客网 时间:2024/06/05 00:38

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

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

 

 


原创粉丝点击