EBP与ESP的作用

EBP是当前函数的存取指针,就是存储或读取函数中变量的指针基地址。ESP就是当前函数的栈顶指针。每一次发生函数调用的时候,在被call func初始化的时候都会把当前函数的EBP入栈,保证在子函数返回到主函数的时候能够找到栈帧基地址EBP

假设某一个main函数调用某一个test(int a,int b)函数

假设此时的main函数的ESP指针已经指向了0X896FFFAA,EBP为0x896FFFFFF

push a; 完成参数a的压栈,ESP = 0X896FFFAA - 4 = 0X896FFFA6

push b; 完成参数b的压栈,ESP = 0X896FFFAA - 8 = 0X896FFFA2

call test; 完成test函数返回地址的压栈,ESP = 0X896FFFAA - 0XC = 0X896FFF9D

{

push ebp ; 保护先前的EBP指针,就是把main函数基地址0x896FFFFFF入栈,此时的ESP为0x896FFFF99

mov ebp ,esp; 设置ebp的指针指向栈顶0x896FFFF99,这个0x896FFFF99 EBP就是当前tast函数的栈帧基地址

mov eax , dword ptr [ebp + 0xc] ; ebp+0xc 就是参数a保存的地址

mov eax , dword ptr [ebp + 0x8] ; ebp+0x8 就是参数b保存的地址

sub esp,8; 给函数的局部变量开辟栈空间,此时的esp继续减小 = 0x896FFFF91

add esp ,8 ; 销毁局部变量,esp += 8, = 0x896FFFF99

pop ebp; 出栈,恢复EBP,ESP+=4, = 0x896FFFF9D

ret 8; ret返回,弹出返回地址,ESP+=4, ESP= 0X896FFFA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP= 0X896FFFAA, 恢复进入函数前的堆栈.

}

EBP与ESP的作用相关推荐

  1. 栈帧详解ebp、esp

    一. 理解栈帧 栈帧是什么,我们基本的理解是栈帧也叫活动记录过程,是编译器用来实现过程 函数调用的一种数据结构.通俗来说栈帧就时C语言函数在调用的过程中的调用原理,就是当我们执行一个函数操作的时候,它 ...

  2. 栈帧及EBP、ESP寄存器及出入栈的流程

    接下来咱们以一个例子来说明EBP.ESP寄存器的作用.由于刚是自己理解的,有错误可以提出,共同进步. 这个是栈帧的结构 以下是按调用约定__stdcall 调用函数test(int p1,int p2 ...

  3. C代码反汇编后的堆栈寄存器EBP和ESP

    最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp- ...

  4. 详解C++代码反汇编后的堆栈寄存器EBP和ESP

    最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp- ...

  5. C和汇编混合编程--------函数调用后ebp、esp值问题

    今天老师又给了一个程序,让我们分析,记录一下分析过程 程序: #include "stdio.h" #include "string.h"char *shell ...

  6. eax, ebx, ecx, edx, esi, edi, ebp, esp

    单个的人是脆弱无力的,就像漂流的鲁滨孙一样,只有同别人在一路,他才干完成很多事业.eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编说话中CPU上的通用存放 ...

  7. EBP 和 ESP 详解

    基本概念: (1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶. (2)EBP:基址指针寄存器(extended  ...

  8. c语言函数调用与ebp,esp的关系

    简单的介绍一下intel汇编指令集和gnu 汇编指令有什么差别 下面的介绍很多引用来自于这一篇文档 AT&T 汇编语言与 GCC 内嵌汇编简介 在 INTEL 语法中,第一个表示目的操作数,第 ...

  9. EAX、ESP、EBP等寄存器的作用

    参考一: 一般寄存器:AX.BX.CX.DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DI SI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存 ...

最新文章

  1. C#Hello World
  2. keil5建立多文件的时候为什么总是出错
  3. 分布式应用架构中的数据传输对象(DTO)
  4. 卓越管理的实践技巧(1)如何进行有效的指导 Guidelines for Effective Coaching
  5. 税收与补贴问题(洛谷-P1023)
  6. activity调用fragment的方法_Fragment 的现在以及未来
  7. 多学一点(十三)——解决Linux kdump服务启动失败
  8. Nagios监控Linux主机
  9. C++类的静态成员函数
  10. 【机器学习笔记1】一元线性回归模型及预测
  11. win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04
  12. ios html5键盘弹出视图上移,ios 软键盘弹出, 页面整体上移问题
  13. 不要因为英语和数学而害怕学习编程.
  14. 初中计算机ps教程,初中信息技术《Photoshop 初探——基本操作》教学设计
  15. “双一流”霸气官宣:博士生,涨薪!
  16. 服务器与pc机的区别
  17. DevStack环境搭建
  18. 美团Java后台开发面经
  19. 面试中关于Redis的问题
  20. Constraint generation(CG) approach

热门文章

  1. 网罗天下 v1.0 下载
  2. vue 评论区回复无限嵌套实现代码
  3. Clickhouse其它类型表引擎(Live View、Null、URL)
  4. Netty网络编程实战2,使用Netty开发聊天室功能
  5. php groovy,Groovy
  6. 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
  7. XTPToolKitPro常用功能
  8. 什么是uid?什么是Auth?什么是验证器?
  9. 记一次CTF过程(Writeup)
  10. 打入苹果ipad的大陆芯片供应商