美文网首页
程序为什么开头总是PUSH EBP(栈帧)

程序为什么开头总是PUSH EBP(栈帧)

作者: Littleston | 来源:发表于2018-10-17 16:44 被阅读0次

子程序如何存取参数,对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据右图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2。

相关文章

  • 程序为什么开头总是PUSH EBP(栈帧)

    子程序如何存取参数,对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 E...

  • canary骚操作一览

    canary是栈溢出的防护机制,一般是位于ebp的上方,用于检测栈帧是否有溢出状态,用图形表示: 因为一个栈帧往往...

  • Linux内核原理初窥

    函数堆栈 esp栈顶指针 ebp栈基址指针call:将ebp压栈,并让ebp=espret:将esp=ebp,并将...

  • 2.1ebp,esp与call

    CALL框架` EBP寄存器 栈底指针ESP寄存器 栈顶指针一、EBP栈底指针EBP是一个特殊的寄存器,通过EBP...

  • 宏、普通函数、内联函数之间的区别

    普通函数 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代...

  • 详解 JVM 字节码(6)重载

    栈帧 【图】 栈 帧我们程序就是一个交互的电影每一个线程都会有一个栈帧,栈帧本身是一种数据结构,封装了方法的局部变...

  • 栈为什么效率比堆高

    栈为什么效率比堆高 总结如下: 1、有寄存器直接对栈进行访问(esp,ebp),而对堆访问,只能是间接寻址。 也就...

  • C++调用函数的过程

    首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指...

  • 程序的机器级表示之过程调用2

    一个c过程的大致过程如下: --准备阶段 1.形成帧底:push指令和mov指令 2.形成栈帧(如果需要的...

  • 第4篇:戏说程序栈-栈帧

    本篇详细讲解有关IA32约定中的程序栈帧,我栈顶到栈底的方向逐一回顾一下。 当前栈帧从栈顶到栈底如下构成 创建的参...

网友评论

      本文标题:程序为什么开头总是PUSH EBP(栈帧)

      本文链接:https://www.haomeiwen.com/subject/ekyrzftx.html