接下来咱们以一个例子来说明EBP、ESP寄存器的作用。由于刚是自己理解的,有错误可以提出,共同进步。

这个是栈帧的结构

以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码

如果运行函数前堆栈指针ESP为0xAAAAAAA 。EBP为0xAAAAAB0

push   p2    ;參数2入栈, ESP -= 4h , ESP = 0xAAAAAAA - 4h =    0xAAAAAA6

push   p1    ;參数1入栈, ESP -= 4h , ESP = 0xAAAAAAA - 8h =    0xAAAAAA2

call test    ;压入返回地址 ESP -= 4h, ESP = 0xAAAAAAA- 0Ch  = 0xAAAAA9D,注意:这里是test函数的返回地址。即在代码段中的地址(偏移)。

;//进入函数内

{

push   ebp                           ;保护先前EBP指针, EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别), ESP-=4h, ESP = 0xAAAAA99

mov    ebp, esp                   ;设置EBP指针指向栈顶 0xAAAAA99

mov    eax, dword ptr  [ebp+0ch]   ;ebp+0ch为0xAAAAAA6即參数2的位置

mov    ebx, dword ptr  [ebp+08h]   ;ebp+08h为0xAAAAAA2,即參数1的位置

sub    esp, 8                     ;局部变量所占空间ESP-=8, ESP =  0xAAAAA91

...

add    esp, 8                     ;释放局部变量, ESP+=8, ESP =  0xAAAAA99

pop    ebp                       ;出栈,恢复EBP, ESP+=4, ESP =  0xAAAAA9D,即把栈中地址0xAAAAAB0的内容pop到ebp中,恢复现场。

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

}

原来ESP就是一直指向栈顶的指针。

而EBP有两种作用,第一种,作为基址对参数的调用通过加减来调用。

第二种,作为栈底地址。在调用新的函数时,会把上一个原函数的栈底地址入栈保存现场,然后把esp的地址赋予ebp作为栈底地址。

每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈,以便从子函数返回到主函数时能够获取EBP。

栈帧及EBP、ESP寄存器及出入栈的流程相关推荐

  1. eax,ebx,ecx,edx,esi,edi,ebp,esp寄存器的作用

    eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86汇编语言中CPU上的通用寄存器的名称,是32位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比方 ...

  2. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp 寄存器 含义

    eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比 ...

  3. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  4. linux系统调用和内存管理以及栈帧

    linux编程和C++笔记 目录 linux编程和C++笔记 0. terminal操作快捷键等 1. vfork的子进程return程序会挂掉,但exit不会 2. C++内存管理详解 3. 关于堆 ...

  5. 汇编-栈帧-寄存器esp, ebp

    转载 原文地址 栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向 ...

  6. 栈帧ebp,esp详解

    栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部 ...

  7. 栈帧详解ebp、esp

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

  8. 浅析栈指针ESP和帧指针EBP

    ESP和EBP是刚接触栈的时候就碰到的两个指针.对这两个我一直是处于一知半解状态. 错误认知:ESP是指向栈顶指针,EBP是指向栈底指针. 我这么认为已经很长时间了,而且自己觉得没问题. 直到今天看英 ...

  9. X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作

    X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AM ...

最新文章

  1. Android SQLite数据库的基本操作-SQLiteDatabase
  2. boost::mp11::mp_map_erase相关用法的测试程序
  3. java 生成 xml dtd_使用DTD文件中的JAXB生成Java类 – 如何修改DTD?
  4. Java获取指定月份的最后一天
  5. 匿名管道和pipe函数
  6. lol云顶之奕助手_关于云顶之奕的感想
  7. 当html里语义化,HTML5语义化
  8. 关于AAARR模型,还停留在理论却不会用?附实例讲解
  9. 小米8android版本打开,怎么查看小米手机安卓系统版本
  10. Git简洁教程:本地项目如何与GitHub互连
  11. 丢失MSVCR71.dll问题解决
  12. linux登陆端口号和协议,linux iso镜像下载 协议号与端口号大全
  13. 一文带你了解影响因子IF和SCI分区
  14. 易捷文件共享web服务器 v3.5,易捷文件共享Web服务器 官方版
  15. 京东Java后台开发岗社招面试经验分享,4面的面经
  16. irepot使用简介
  17. MTK平台一个花屏重启问题的分析
  18. 聊聊 Spring Boot 2.0 的 WebFlux
  19. 优信二手车创新发展,获业内外交口称赞
  20. 熟读,理解,背诵,融会贯通!

热门文章

  1. 厦门大学2018年转专业计算机,厦门大学各学院2017年接收转专业学生计划.PDF
  2. 美国医生推荐感冒食疗方
  3. 解决ElementUI列表大数据操作卡顿问题
  4. 酷睿i7 8565u属于什么级别 i78565u相当于什么水平
  5. 局域网访问文件提示服务器内存不足,“服务器存储空间不足”的问题
  6. 直播带货那么火,测试人员如何对直播类产品的直播质量进行测试呢?
  7. 试验数据管理系统TDM与SDM
  8. “算力经济”时代扑面而来,智算中心成未来数据中心进化方向
  9. linux||Linux的操作系统的简单指令
  10. 微信用户头像不能高清问题