c++反汇编代码分析–循环结构

推荐阅读:

C++反汇编代码分析–函数调用

C++反汇编代码分析–循环结构

C++反汇编代码分析–偷调函数

走进内存,走进汇编指令来看C/C++指针

在此主要讨论或者验证三点:

1、循环结构的反汇编代码分析

2、函数中,局部变量的保存位置

3、方法的返回值保存位置验证

一个没有找到答案的疑问c++反汇编代码分析--循环结构

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追踪过,单步调试时,这一部分区域并没有用到,这一区域的作用是什么?

代码如下:
1c++反汇编代码分析--循环结构int sum()

2c++反汇编代码分析--循环结构c++反汇编代码分析--循环结构c++反汇编代码分析--循环结构{

3c++反汇编代码分析--循环结构 int subResult=0;

4c++反汇编代码分析--循环结构 for (int i=0;i<3;i++)

5c++反汇编代码分析--循环结构c++反汇编代码分析--循环结构 c++反汇编代码分析--循环结构{

6c++反汇编代码分析--循环结构 subResult+=1;

7c++反汇编代码分析--循环结构 }

8c++反汇编代码分析--循环结构 return subResult;

9c++反汇编代码分析--循环结构}

10c++反汇编代码分析--循环结构

11c++反汇编代码分析--循环结构void main()

12c++反汇编代码分析--循环结构c++反汇编代码分析--循环结构c++反汇编代码分析--循环结构{

13c++反汇编代码分析--循环结构 int result = sum();

14c++反汇编代码分析--循环结构 printf("%dn",result);

15c++反汇编代码分析--循环结构}由于方法的调用已经在上一篇中说过,这里直接分析内部有循环结构的sum()方法

反汇编代码及分析:

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的位置

;参看下图可知


c++反汇编代码分析--循环结构

;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函数的返回值的传递情况:

c++反汇编代码分析--循环结构

13: }

00401065 pop edi

00401066 pop esi

00401067 pop ebx

00401068 mov esp,ebp

0040106A pop ebp

0040106B ret原文链接: https://www.cnblogs.com/shitouer/archive/2010/04/05/1704881.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/9566

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午10:25
下一篇 2023年2月6日 下午10:25

相关推荐