C代码反汇编后的堆栈寄存器EBP和ESP
最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对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相关推荐
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp- ...
- 了解寄存器: EBP寄存器
EBP寄存器 在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX用于记数等等.在win32的环境下EBP寄存器用与存放在进入call以后的 ...
- 段寄存器中代码段数据段堆栈段附加段
段寄存器中代码段数据段堆栈段附加段
- 栈帧及EBP、ESP寄存器及出入栈的流程
接下来咱们以一个例子来说明EBP.ESP寄存器的作用.由于刚是自己理解的,有错误可以提出,共同进步. 这个是栈帧的结构 以下是按调用约定__stdcall 调用函数test(int p1,int p2 ...
- arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc
arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...
- C和汇编混合编程--------函数调用后ebp、esp值问题
今天老师又给了一个程序,让我们分析,记录一下分析过程 程序: #include "stdio.h" #include "string.h"char *shell ...
- c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...
- 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出
报错:0x000CC3C9 处有未经处理的异常(在 image_opencv2.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 主要检查代码中有没有对数组的越界操作, ...
- Google Analytics 跟踪代码安装后状态总是显示'未安装跟踪代码'
最近要使用Google Analytics,但是在跟踪代码安装后状态总是显示'未安装跟踪代码'!如下所示: 在Google Analytics的帮助中"排查常见的跟踪设置错误" ...
最新文章
- HTML文本应当存储为UTF-8无BOM格式!
- linux 修改默认路径吗,linux中vsftp修改默认路径
- 《低功耗蓝牙开发权威指南》——第3章低功耗蓝牙的体系结构
- vue借助axios实现网络通信
- 计算机怎样旋转桌面,win7电脑怎么设置翻转屏幕
- 信息学奥赛C++语言: 跑步
- MySQl Window Function Concepts
- 什么是离线迁移(闪电立方)
- UG1969软件详细安装教程
- android p正式版一加6,一加6T出厂搭载Android P 将于11月5日发布tokyo hot n0727
- 联想l430主板图纸_【有图】Thinkpad L430升级内存,点亮,成功实现双通道!附详细教程及评测!!!...
- 无线通信网络学习笔记-1
- matlab单位函数定义,MATLAB 函数(一)
- mysql提示2002错误的解决方法
- NLP-D33-毕设答辩-《人类语言处理》04-05-Location-aware-attentionCTC大数据比赛报名答辩被从源头上暴
- 强大的文字处理器——Nisus Writer Pro
- ucharts动态渲染数据
- spring-bean生命周期
- 广点通-优量汇广告接入文档
- win11怎么分回c盘空间