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

ebp--栈底指针

esp--栈顶指针

如图所示,简化后的代码调用过程如下:

void Layer02()

{

int b = 2;

}

void Layer01()

{

int a = 1;

Layer02();

}

那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码:

void Layer02()

{

00413700 push        ebp

00413701 mov         ebp,esp

00413703 sub         esp,0CCh

00413709 push        ebx

0041370A push        esi

0041370B push        edi

0041370C lea         edi,[ebp-0CCh]

00413712 mov         ecx,33h

00413717 mov         eax,0CCCCCCCCh

0041371C rep stos    dword ptr es:[edi]

int b = 2;

0041371E mov         dword ptr [b],2

}

00413725 pop         edi

00413726 pop         esi

00413727 pop         ebx

00413728 mov         esp,ebp

0041372A pop         ebp

0041372B ret

我们看到函数调用开始执行如下的两行代码:

00413700 push        ebp

00413701 mov         ebp,esp

返回前执行如下代码:

00413728 mov         esp,ebp

0041372A pop         ebp

0041372B ret

那么这几行代码到底是什么意思呢?首先,如图上所示:

开始两行代码的意思是先将ebp1压栈,然后将现在的栈顶esp1作为函数调用时的栈底,所以会执行如下语句:

00413701 mov         ebp,esp

那么,返回前的几条语句又是什么意思呢?

我想大家已经猜到了,当函数调用执行结束,我们要执行相反的过程:

00413728 mov         esp,ebp

还原栈顶指针

0041372A pop         ebp

还原栈底指针

0041372B ret

返回到函数调用前的指令继续执行。待续…

C代码反汇编后的堆栈寄存器EBP和ESP相关推荐

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

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

  2. 了解寄存器: EBP寄存器

    EBP寄存器 在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX用于记数等等.在win32的环境下EBP寄存器用与存放在进入call以后的 ...

  3. 段寄存器中代码段数据段堆栈段附加段

    段寄存器中代码段数据段堆栈段附加段

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

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

  5. arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc

    arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...

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

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

  7. c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...

    BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...

  8. 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出

     报错:0x000CC3C9 处有未经处理的异常(在 image_opencv2.exe 中):  堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 主要检查代码中有没有对数组的越界操作, ...

  9. Google Analytics 跟踪代码安装后状态总是显示'未安装跟踪代码'

    最近要使用Google Analytics,但是在跟踪代码安装后状态总是显示'未安装跟踪代码'!如下所示:   在Google Analytics的帮助中"排查常见的跟踪设置错误" ...

最新文章

  1. HTML文本应当存储为UTF-8无BOM格式!
  2. linux 修改默认路径吗,linux中vsftp修改默认路径
  3. 《低功耗蓝牙开发权威指南》——第3章低功耗蓝牙的体系结构
  4. vue借助axios实现网络通信
  5. 计算机怎样旋转桌面,win7电脑怎么设置翻转屏幕
  6. 信息学奥赛C++语言: 跑步
  7. MySQl Window Function Concepts
  8. 什么是离线迁移(闪电立方)
  9. UG1969软件详细安装教程
  10. android p正式版一加6,一加6T出厂搭载Android P 将于11月5日发布tokyo hot n0727
  11. 联想l430主板图纸_【有图】Thinkpad L430升级内存,点亮,成功实现双通道!附详细教程及评测!!!...
  12. 无线通信网络学习笔记-1
  13. matlab单位函数定义,MATLAB 函数(一)
  14. mysql提示2002错误的解决方法
  15. NLP-D33-毕设答辩-《人类语言处理》04-05-Location-aware-attentionCTC大数据比赛报名答辩被从源头上暴
  16. 强大的文字处理器——Nisus Writer Pro
  17. ucharts动态渲染数据
  18. spring-bean生命周期
  19. 广点通-优量汇广告接入文档
  20. win11怎么分回c盘空间

热门文章

  1. 开启POP3/SMTP服务
  2. 岛屿的个数number-of-islands
  3. ethercat主站控制软件TwinCAT的安装
  4. FDS (Flex Data Services)
  5. [网络安全自学篇] 八十.WHUCTF之WEB类解题思路WP(代码审计、文件包含、过滤绕过、SQL注入)
  6. iOS之深入解析KVC的底层原理和自定义KVC的实现
  7. OpenGL之深入解析坐标系
  8. Nginx URL 重写
  9. Jenkins 基本概念与简介
  10. 树莓派 VNC Viewer 远程桌面配置教程