(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
ESP 中的指针将一直指向这个新位置, 所以 ESP 中的地址数据是动态的。
三:一.概念分析 经常看到下面这两句: pushl %ebp -------------------------------------------------------------------------------- 那两条指令的意思是 将栈顶指向 ebp 的地址 以下摘自网上一篇文章: push ebp ;ebp入栈 --------------------------------------------------------------- esp始终指向栈顶,ebp是在堆栈中寻址用的 *********************************************************************************************** 我的理解: 调用一个函数时,先将堆栈原先的基址(EBP)入栈,以保存之前任务的信息。然后将栈顶指针的值赋给EBP,将之前的栈顶作为新的基址(栈底),然后再这个基址上开辟相应的空间用作被调用函数的堆栈。函数返回后,从EBP中可取出之前的ESP值,使栈顶恢复函数调用前的位置;再从恢复后的栈顶可弹出之前的EBP值,因为这个值在函数调用前一步被压入堆栈。这样,EBP和ESP就都恢复了调用前的位置,堆栈恢复函数调用前的状态。 二.通过ollydbg跟踪esp和ebp
发现文字描述还是太没有快感。上几幅图,来说明这个调试过程更好。此文对于深刻理解ebp,esp是具有长远意义的 然后我们让它执行前两句,push ebp,mov ebp,esp 接着上图不解释: 所以重点就在pop这个语句了。pop ebp究竟表达神马意思?ebp的值起初存在了栈中,出栈以后,它的值就恢复了原样。所一句灰常重要啊。pop的意思也许就是把弹出的值赋给我们的变量,pop ebp,也就是把存在栈中的值弹出来赋给ebp。 所以我在这里总结几句: 1、两句的mov ebp,esp实际上是把ebp进栈后的栈顶地址给了ebp。 2、在ebp没有出栈钱,它会一直保存ebp进栈以后的栈顶值,也就是1的值。 3、在ebp出栈前,需要把esp恢复到只有ebp在栈中时的值。 4、出栈后,esp自然恢复到ebp进栈以前的初始值,而pop ebp则恢复了ebp的初始值。 5、pop的语义很重要,pop ebp的意思是把当前栈顶的元素出栈,送入ebp中,而不是让ebp出栈,这点必须明确! |