esp寄存器与ebp寄存器介绍

esp寄存器与ebp寄存器介绍

2013年09月21日 03:04:15 伤心小鸵鸟 阅读数:974

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/westboy666/article/details/11858225

    ESP

ESP(Extended stack pointer)是指针寄存器的一种(另一种为EBP)。用于堆栈指针。

ESP为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部),而EBP为帧指针,指向当前活动记录的顶部。

栈指针与帧指针标识出了当前活动记录的位置。

当函数被调用的时候,执行如下操作:

⒈将帧指针压入栈中:push ebp

⒉用ebp保存当前栈指针:mov ebp,esp    ( 汇编代码最为常见的是ATT和intel汇编代码格式,操作数的循序相反,此处不知                                                                //是那种汇编代码格式?我经常是这样写:mov esp, ebp:它的意思是把当前的栈指针                                                               // 寄存器esp中的地址保存到帧指针寄存器ebp中。)

⒊使得栈指针自减,自减得到的内存应当能够被用来存储被调用函数的本地状态:sub 0CCh,esp

EBP

扩展基址指针寄存器(extended base pointer)  其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。

每个任务(进程)有一个栈(是不是可以这样理解一个程序中只有一个栈,每个函数对应一个栈中一段区域即帧),在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为帧(frame)。%esp寄存器指向当前整个栈的栈顶,% ebp指向当前帧的帧底。上一级调用者的帧底被压入当前%ebp内容所指的地址,也就是当前帧的帧底位置保存了上一级调用者的%ebp指针值(帧底),而每个%ebp的前一个单元存放的就是当前函数的返回地址(它是由调用者在call指令中入的栈),保证是在上以及(应改为:一级)帧的最后一个空间单元(也就说“返回地址”的空间单元的位置在每个帧中都有,譬如说:main()函数的帧中也有“返回地址”空间单元,单元中的内容是call指令发生时自带的一个命令动作,这个动作就是把call指令的下一条指令的地址入栈,这个入栈动作就产生了“返回地址”空间单元,并把call指令下一条的指令地址也就立即存入了这个“返回地址”空间单元中,这个空间单元的作用是为将来main()调用另外的函数譬如:son()使用,也就是说为子函数使用。子函数如何使用呢?当son函数执行完后返回时就要返回到这个“返回地址”空间单元地址处。同样如果son函数中也有调用函数的语句,在反汇编语言中也会出现call指令,只要出现call指令就会有它的(指son()的)“返回地址”空间单元的存在)。这样就可以 根据当前%ebp的值回溯出整个任务的调用栈(调用过程)。    

在函数栈帧中,一般包含以下几类重要信息。 (1)局部变量:为函数局部变量开辟的内存空间。  (2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过栈帧平衡计  算得到),用于在本栈被弹出后恢复出上一个栈帧。  (3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回  时能够恢复到函数被调用前的代码区中继续执行指令。

  注:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是 在不停变化的。  除了与栈相关的寄存器外,我们还需要记住另一个至关重要的寄存器。  EIP:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待  执行的指令地址。  可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令

猜你喜欢

转载自blog.csdn.net/weixin_41632560/article/details/83013882