详解C++代码反汇编后的堆栈寄存器EBP和ESP
2012-09-07 23:12
330 查看
/article/4888001.html
详解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++
详解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++
相关文章推荐
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- 详解C++代码反汇编后的堆栈寄存器EBP和ESP
- C++代码反汇编后的堆栈寄存器EBP和ESP
- C++代码反汇编后的函数调用过程,堆栈寄存器EBP和ESP
- C代码反汇编后的堆栈寄存器EBP和ESP
- C++ - 类模板(class template) 详解 及 代码
- n皇后详解及代码实现/C++
- 在C++中内嵌汇编代码分析
- 我的C++ (二) - 汇编代码 和 C++代码混写
- C++ 字符串拷贝 汇编代码实现
- 数据结构 - 堆排序(heap sort) 详解 及 代码(C++)
- c/c++中define用法详解及代码示例
- 在VC++6.0中查看C/C++对应的汇编代码方法
- 函数调用(ebp,esp详解)
- X64 平台 C/C++调用汇编代码