汇编反FOR 循环

  
 

简单反汇编之for循环

分类: 汇编   402人阅读  评论(0)  收藏  举报

   今天继续简单反汇编之for循环,先看c++源码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2.   
  3. void test(int a,int b)  
  4. {  
  5.     int c=1;  
  6.     for(int i=0;i<10;i++)  
  7.     {  
  8.         c=c+a+b+i;  
  9.     }  
  10.     printf("%d/n",c);  
  11. }  
  12.   
  13. int main(int argc, char* argv[])  
  14. {  
  15.     test(1,2);  
  16.     return 0;  
  17. }  

 

先来分析debug版本的,F10 Go To Disassembly,因为main函数里面就一个调用test函数代码,所以就不列出了,具体看test函数代码:

[cpp]  view plain copy
  1. 3:    void test(int a,int b)  
  2. 4:    {  
  3. 00401020   push        ebp  
  4. 00401021   mov         ebp,esp  
  5. 00401023   sub         esp,48h  
  6. 00401026   push        ebx  
  7. 00401027   push        esi  
  8. 00401028   push        edi  
  9. 00401029   lea         edi,[ebp-48h]  
  10. 0040102C   mov         ecx,12h  
  11. 00401031   mov         eax,0CCCCCCCCh  
  12. 00401036   rep stos    dword ptr [edi]  
  13.   
  14. 5:        int c=1;  
  15. 00401038   mov         dword ptr [ebp-4],1    //初始化第一个变量,并赋值为1  
  16. 6:        for(int i=0;i<10;i++)  
  17. 0040103F   mov         dword ptr [ebp-8],0    //初始化第二个变量,并赋值为0  
  18. 00401046   jmp         test+31h (00401051)    //直接跳转00401051  
  19. 00401048   mov         eax,dword ptr [ebp-8]  //取出第二个变量放入eax  
  20. 0040104B   add         eax,1                  //eax+1  
  21. 0040104E   mov         dword ptr [ebp-8],eax  //eax的值放入第二个变量  
  22. 00401051   cmp         dword ptr [ebp-8],0Ah  //用第二个变量和10比较  
  23. 00401055   jge         test+48h (00401068)    //大于等于跳转到00401068  
  24. 7:        {  
  25. 8:            c=c+a+b+i;  
  26. 00401057   mov         ecx,dword ptr [ebp-4]  //第一个变量放入ecx  
  27. 0040105A   add         ecx,dword ptr [ebp+8]  //第一个变量+第一个参数,结果放入ecx  
  28. 0040105D   add         ecx,dword ptr [ebp+0Ch]//ecx+第二个参数,结果放入ecx  
  29. 00401060   add         ecx,dword ptr [ebp-8]  //ecx+第二个变量,结果放入ecx  
  30. 00401063   mov         dword ptr [ebp-4],ecx  //把最后的结果放入第一个变量  
  31. 9:        }  
  32. 00401066   jmp         test+28h (00401048)    //跳转到上面进行判断  
  33. 10:       printf("%d/n",c);  
  34. 00401068   mov         edx,dword ptr [ebp-4]  //把第一个变量放入edx  
  35. 0040106B   push        edx                    //参数入栈  
  36. 0040106C   push        offset string "%d" (0042201c) //入栈字符  
  37. 00401071   call        printf (00401100)      //调用打印  
  38. 00401076   add         esp,8                  //清理堆栈  
  39. 11:   }  
  40.   
  41. 00401079   pop         edi  
  42. 0040107A   pop         esi  
  43. 0040107B   pop         ebx  
  44. 0040107C   add         esp,48h  
  45. 0040107F   cmp         ebp,esp  
  46. 00401081   call        __chkesp (00401180)  
  47. 00401086   mov         esp,ebp  
  48. 00401088   pop         ebp  
  49. 00401089   ret  

 

下面分析下代码如下:

[cpp]  view plain copy
  1. 00401000      8B5424 08     MOV EDX,DWORD PTR SS:[ESP+8]   //第二个参数放入edx中  
  2. 00401004      56            PUSH ESI   //入栈esi  
  3. 00401005     8B7424 08     MOV ESI,DWORD PTR SS:[ESP+8]  //第一个参数放入esi中  
  4. 00401009     57            PUSH EDI        //入栈edi  
  5. 0040100A      B9 01000000   MOV ECX,1      //ecx初始化1  
  6. 0040100F      33C0          XOR EAX,EAX    //eax清0  
  7. 00401011      8D3C30        LEA EDI,DWORD PTR DS:[EAX+ESI]  //将偏移值放入edi中,其实就是计算eax+esi的值(这步其实是i+a,将结果放入edi中)    
  8. 00401014      03FA          ADD EDI,EDX  //这步其实是edi+b就等于i+a+b,结果放入edi中  
  9. 00401016      03CF          ADD ECX,EDI  //这步i+a+b+c结果放入ecx中,这里可以看出ecx也就是变量c  
  10. 00401018      40            INC EAX      //eax也就是变量i,自增1  
  11. 00401019      83F8 0A       CMP EAX,0A   //a跟10比较  
  12. 0040101C      7C F3         JL SHORT asm_for.00401011  //小于跳转到00401011,继续循环  
  13. 0040101E      51            PUSH ECX     //循环完之后走到这里入栈显示参数  
  14. 0040101F      68 30704000   PUSH asm_for.00407030     //入栈字符  
  15. 00401024      E8 17000000   CALL asm_for.00401040     //调用打印call  
  16. 00401029      83C4 08       ADD ESP,8    //清理堆栈  
  17. 0040102C     5F            POP EDI         
  18. 0040102D     5E            POP ESI       //出栈,跟前面相对应  
  19. 0040102E     C3            RETN  
  20. 0040102F      90            NOP  
  21. 00401030     6A 02         PUSH 2           //函数入口压入2个参数  
  22. 00401032      6A 01         PUSH 1  
  23. 00401034      E8 C7FFFFFF   CALL asm_for.00401000   //调用test  
  24. 00401039      83C4 08       ADD ESP,8               //清理堆栈   
  25. 0040103C      33C0          XOR EAX,EAX  
  26. 0040103E      C3            RETN  

 

 可以看出同样的代码反汇编出来的汇编代码却很大不同,但是结果都是一样,也就是说编译器在优化代码的时候是不会改变代码的流程及处理结果,只是针对算法做了优化处理。

查看评论

  暂无评论

发表评论
  • 用 户 名:
  • tangyanzhi1111
  • 评论内容:
  • 插入代码
  •   
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
  • 个人资料
  •  
    • 访问:35950次
    • 积分:931分
    • 排名:第11233名
    • 原创:56篇
    • 转载:10篇
    • 译文:0篇
    • 评论:20条
  • 文章分类
  • 文章存档
  • 推荐文章
    • 最新评论
    公司简介| 招贤纳士| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 法律顾问| 问题报告
    QQ客服  微博客服  论坛反馈    服务热线:400-600-2320
    京 ICP 证 070598 号
    北京创新乐知信息技术有限公司 版权所有
    世纪乐知(北京)网络技术有限公司 提供技术支持
    江苏乐知网络技术有限公司 提供商务支持
    Copyright © 1999-2012, CSDN.NET, All Rights Reserved  GongshangLogo
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值