c++反汇编代码分析--循环结构
来源:互联网 发布:ip网络功放系统图 编辑:程序博客网 时间:2024/05/16 00:28
在此主要讨论或者验证三点:
1、循环结构的反汇编代码分析
2、函数中,局部变量的保存位置
3、方法的返回值保存位置验证
一个没有找到答案的疑问:
00401029 lea edi,[ebp-48h]
0040102C mov ecx,12h
00401031 mov eax,0CCCCCCCCh
;这段代码是在栈中开辟一个48字节大小的区域来存放局部变量,但是如果函数内
没有局部变量,则是lea edi,[ebp-40h]
一个局部变量,则是lea edi,[ebp-44h]
两个局部变量,则是lea edi,[ebp-48h]
也就是没有局部变量时开辟的40个字节,我用F11追踪过,单步调试时,这一部分区域并没有用到,这一区域的作用是什么?
代码如下:
1int sum()
2{
3 int subResult=0;
4 for (int i=0;i<3;i++)
5 {
6 subResult+=1;
7 }
8 return subResult;
9}
10
11void main()
12{
13 int result = sum();
14 printf("%\d\n",result);
15}
由于方法的调用已经在上一篇中说过,这里直接分析内部有循环结构的sum()方法2{
3 int subResult=0;
4 for (int i=0;i<3;i++)
5 {
6 subResult+=1;
7 }
8 return subResult;
9}
10
11void main()
12{
13 int result = sum();
14 printf("%\d\n",result);
15}
反汇编代码及分析:
5: int sum()
6: {
00401020 push ebp
;ESP = 0012FEF0 EBP = 0012FF48
00401021 mov ebp,esp
;ESP = 0012FEF0 EBP = 0012FEF0
00401023 sub esp,48h
;ESP = 0012FEA8 EBP = 0012FEF0
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-48h]
0040102C mov ecx,12h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
7: int subResult=0;
00401038 mov dword ptr [ebp-4],0
8: for (int i=0;i<3;i++)
0040103F mov dword ptr [ebp-8],0
;[ebp-4]=[0012FEEC]处存放的即是局部变量subResult的位置
;[ebp-8]=[0012FEE8]处存放的即是局部变量i的位置
;参看下图可知
;subResult和i的初值均为0
00401046 jmp sum+31h (00401051)
;转到地址00401051(下方蓝字)处去判断循环条件是否满足(请从00401051处接着往下看)
00401048 mov eax,dword ptr [ebp-8]
;将循环条件即i的值复制给eax
0040104B add eax,1
;循环条件修正
0040104E mov dword ptr [ebp-8],eax
;保存修正后的循环条件
00401051 cmp dword ptr [ebp-8],3
00401055 jge sum+42h (00401062)
;比较dword ptr [ebp-8]处的值,即局部变量i的值与3的大小,如果小于3,则往下执行;如果大于等于3,则跳转到00401062处执行
;jge 指令 如果大于或等于则转移
9: {
10: subResult+=1;
00401057 mov ecx,dword ptr [ebp-4]
;将dword ptr [ebp-4]处的值即subResult的值传个寄存器ecx
0040105A add ecx,1
;通过寄存器ecx实现循环加1操作
0040105D mov dword ptr [ebp-4],ecx
;将加1后的值复制给dword ptr [ebp-4]处
11: }
00401060 jmp sum+28h (00401048)
;转移到00401048处,去进行下一轮的循环变量修正和判断
12: return subResult;
00401062 mov eax,dword ptr [ebp-4]
;将最终的结果复制给eax,由此可以验证,函数的返回值保存在寄存器eax中
;为了更好的说明这一点,看下边main函数中sum函数的返回值的传递情况:
13: }
00401065 pop edi
00401066 pop esi
00401067 pop ebx
00401068 mov esp,ebp
0040106A pop ebp
0040106B ret
- c++反汇编代码分析--循环结构
- c++反汇编代码分析--循环结构
- C程序反汇编代码分析
- 反汇编代码分析
- 反汇编代码分析
- 反汇编一个简单的C程序,分析汇编代码
- C语言三种循环反汇编分析
- C语言反汇编代码(三大结构)
- Linux汇编代码学习,反汇编简单的c及分析汇编代码工作过程
- C/C++代码分析时的一些反汇编方法
- C语言反汇编代码分析,理解计算机工作原理
- C++反汇编代码分析
- c语言反汇编代码
- C反汇编示例分析
- 三种循环反汇编代码比较
- C++反汇编->循环语句分析
- 简单C语言反汇编(循环,判断,数组,结构体,共用体,枚举类型)
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 内存对齐全攻略--涉及位域的内存对齐原则
- 嵌入式操作系统内核原理和开发(线程状态)
- pygame.sprite.Sprite
- 内存对齐全攻略--不涉及位域的内存对齐原则
- c++反汇编代码分析--偷调函数
- c++反汇编代码分析--循环结构
- C++反汇编代码分析--函数调用
- arm-linux-gcc 常用参数讲解 gcc编译器使用方法
- 在XSLT中对for-each语句使用distinct操作
- 2012.10.11 周四
- 获取网卡MAC地址
- hdu 2829 Lawrence 四边形优化 dp
- C++面试题:介绍一下STL,STL如何实现vector
- 准备用CSDN博客记录我程序员生涯的点滴历程