关于esp和ebp的学习总结

什么是栈帧?

从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的 局部变量 、函数执行完后返回到哪里等等。
实现上有硬件方式和软件方式(有些体系不支持硬件栈)
首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。
注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。
 首先,来熟悉一下概念:  
    每个任务(进程)有一个栈,在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为 帧(frame)%esp寄存器指向当前整个栈的栈顶,% ebp指向当前帧的帧底。上一级调用者的帧底被压入当前% ebp内容所指的地址,也就是当前帧的帧底位置保存了上一级调用者的% ebp指针值(帧底),而每个% ebp的前一个单元存放的就是当前函数的返回地址(它是由调用者在call指令中入的栈),保证是在上以及帧的最后一个空间单元。这样就可以根据当前% ebp的值回溯出整个任务的调用栈(调用过程)。    
    在函数栈帧中,一般包含以下几类重要信息。 
(1)局部变量:为函数局部变量开辟的内存空间。
(2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过栈帧平衡计 算得到),用于在本栈被弹出后恢复出上一个栈帧。 
 (3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回  时能够恢复到函数被调用前的代码区中继续执行指令。 
     注:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是在不停变化的。除了与栈相关的寄存器外,我们还需要记住另一个至关重要的寄存器。 
EIP:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待执行的指令地址。可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。      

 栈和栈帧 
    栈(stack)相对整个系统而言,调用栈(Call stack)相对某个进程而言,栈帧(stack frame)则是相对某个函数而言,调用栈就是正在使用的栈空间,由多个嵌套调用函数所使用的栈帧组成。具体来说,Call stack
就是指存放某个程序的正在运行的函数的信息的栈。Call stack 由 stack frames 组成,每个 stack frame 对应于一个未完成运行的函数。 
    在当今多数计算机体系架构中,函数的参数传递、局部变量的分配和释放都是通过操纵栈来实现的。栈还用来存储返回值信息、保存寄存器以供恢复调用前处理机状态。每次调用一个函数,都要为该次调用的函数实例分配栈空间。为单个函数分配的那部分栈空间就叫做 stack frame,或者这样说,stack frame 这个说法主要是为了描述函数调用关系的。 
    Stack frame 组织方式的重要性和作用体现在两个方面:
第一,它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享;
第二,它定义了被调用者如何使用它自己的 stack frame 来完成局部变量的存储和使用。  



  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值