飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3456|回复: 4

从基础做起,一步一步来逆向!

[复制链接]

该用户从未签到

发表于 2007-8-9 19:41:44 | 显示全部楼层 |阅读模式
我的第一个C++程序

第一种方法,主要是函数不同,以及调用方式的不同
  1. //C++版冒泡排序程序
  2. #include<iOStream>
  3. using namespace std;
  4. void swap(int &a,int &b)
  5. {
  6.         int tem = a;
  7.         a = b;
  8.         b = tem;
  9. }


  10. void main()
  11. {
  12.         int i,j,arr[10];
  13.         for(i=0;i<10;i++)
  14.         {
  15.                 cout<<"请输入10个整数:";
  16.                 cin>>arr[i];
  17.     }
  18.         for(i=0;i<10;i++)                         //数组数据的循环比较
  19.         {        for(j=0;j<10-i-1;j++)    //每一轮的比较
  20.            { if(arr[j]<arr[j+1])       //比较相邻两个数大小
  21.         {  swap(arr[j],arr[j+1]);    //互换函数的调用
  22.                         
  23.         }
  24.         }
  25.         }
  26.         for(i=0;i<10;i++)
  27.         {        cout<<"正确的从大到小的排序:"<<arr[i]<<endl;
  28.         }

  29. }
复制代码
SWAP函数第二种实现及调用方法:
  1. void swap(int *a, int *b)
  2. {int tem = *a;
  3. *a = *b
  4. *b = tem;
  5. }
  6. 调用时是:swap(&arr[j],&arr[j+1])
复制代码
下面是对我这个程序的反汇编代码
  1. 0041E450  push    ebp                             ;从这里开始就是main()函数的开始
  2. 0041E451  mov     ebp, esp
  3. 0041E453  sub     esp, 108
  4. 0041E459  push    ebx
  5. 0041E45A  push    esi
  6. 0041E45B  push    edi
  7. 0041E45C  lea     edi, dword ptr [ebp-108]
  8. 0041E462  mov     ecx, 42
  9. 0041E467  mov     eax, CCCCCCCC
  10. 0041E46C  rep     stos dword ptr es:[edi]
  11. 0041E46E  mov     dword ptr [ebp-8], 0
  12. 0041E475  jmp     short 0041E480
  13. 0041E477  mov     eax, dword ptr [ebp-8]                              ;eax就相当与i ,从这里开始循环
  14. 0041E47A  add     eax, 1                                                      ;i++
  15. 0041E47D  mov     dword ptr [ebp-8], eax                              ;把i保存了
  16. 0041E480  [color=Red]cmp     dword ptr [ebp-8], 0A[/color]   ;i与10比较
  17. 0041E484  jge     short 0041E4AC                                        ;i大于10就跳
  18. 0041E486  push    004570E4                                               ;  请输入10个整数:
  19. 0041E48B  push    004607D0            
  20. 0041E490  call    0041CB6D                                                  ;显示“请输入10个整数:”
  21. 0041E495  add     esp, 8
  22. 0041E498  mov     eax, dword ptr [ebp-8]
  23. 0041E49B  lea     ecx, dword ptr [ebp+eax*4-44]
  24. 0041E49F  push    ecx
  25. 0041E4A0  mov     ecx, 00460710
  26. 0041E4A5  call    0041CAAA                                                 ;执行输入命令,相当与C++中的 cin<<arr[i]
  27. 0041E4AA  jmp     short 0041E477                                        ;跳回去循环


  28. 0041E4AC  mov     dword ptr [ebp-8], 0                                 ;对i进行初始化
  29. 0041E4B3  jmp     short 0041E4BE
  30. 0041E4B5  mov     eax, dword ptr [ebp-8]                                
  31. 0041E4B8  add     eax, 1                                                         ;i++
  32. 0041E4BB  mov     dword ptr [ebp-8], eax
  33. 0041E4BE  cmp     dword ptr [ebp-8], 0A                                ;i与10比较
  34. 0041E4C2  jge     short 0041E512                                           ;大于就跳
  35. 0041E4C4  mov     dword ptr [ebp-14], 0                                 ;相当与对j初始化,j=0
  36. 0041E4CB  jmp     short 0041E4D6
  37. 0041E4CD  mov     eax, dword ptr [ebp-14]                              
  38. 0041E4D0  add     eax, 1                                                        ;j++
  39. 0041E4D3  mov     dword ptr [ebp-14], eax                              
  40. 0041E4D6  mov     eax, 0A                                                     ;从这里开始的三条指令其实就是  10-i-1                 
  41. 0041E4DB  sub     eax, dword ptr [ebp-8]
  42. 0041E4DE  sub     eax, 1
  43. 0041E4E1  cmp     dword ptr [ebp-14], eax                               ;这里就是j<10-i-1
  44. 0041E4E4  jge     short 0041E510                                            ;大于就跳
  45. 0041E4E6  mov     eax, dword ptr [ebp-14]
  46. 0041E4E9  mov     ecx, dword ptr [ebp-14]
  47. 0041E4EC  mov     edx, dword ptr [ebp+eax*4-44]
  48. 0041E4F0  cmp     edx, dword ptr [ebp+ecx*4-40]                     ;这里其实就是 if(arr[j]<arr[j+1])      
  49. 0041E4F4  jge     short 0041E50E                                             ;如果大于那么就不执行SWAP函数
  50. 0041E4F6  mov     eax, dword ptr [ebp-14]
  51. 0041E4F9  lea     ecx, dword ptr [ebp+eax*4-40]
  52. 0041E4FD  push    ecx                                                             ;压入参数a
  53. 0041E4FE  mov     edx, dword ptr [ebp-14]
  54. 0041E501  lea     eax, dword ptr [ebp+edx*4-44]
  55. 0041E505  push    eax                                                              ;压入参数b
  56. 0041E506  call    0041D20C                                                      ;这里就是SWAP互换函数
  57. 0041E50B  add     esp, 8
  58. 0041E50E  jmp     short 0041E4CD                                             ;返回进行for(j=0;j<10-i-1;j++) 循环
  59. 0041E510  jmp     short 0041E4B5                                             ;返回进行for(i=0;i<10;i++) 循环


  60. 0041E512  mov     dword ptr [ebp-8], 0                                      ;好了这里就是对最后一个循环的 i 初始化
  61. 0041E519  jmp     short 0041E524
  62. 0041E51B  mov     eax, dword ptr [ebp-8]
  63. 0041E51E  add     eax, 1
  64. 0041E521  mov     dword ptr [ebp-8], eax
  65. 0041E524  cmp     dword ptr [ebp-8], 0A                                     ;比较 i<10
  66. 0041E528  jge     short 0041E559                                                ;大于就跳
  67. 0041E52A  push    0041C505                                                       ;这个参数就是endl
  68. 0041E52F  mov     eax, dword ptr [ebp-8]
  69. 0041E532  mov     ecx, dword ptr [ebp+eax*4-44]
  70. 0041E536  push    ecx
  71. 0041E537  push    004570C8                                                      ;  字符传“正确的从大到小的排序:”
  72. 0041E53C  push    004607D0
  73. 0041E541  call    0041CB6D                                                        ;这里还是显示字符串
  74. 0041E546  add     esp, 8
  75. 0041E549  mov     ecx, eax
  76. 0041E54B  call    0041C631                                                        ;显示数据arr[i]
  77. 0041E550  mov     ecx, eax
  78. 0041E552  call    0041CB9A                                                        ;将光标换行
  79. 0041E557  jmp     short 0041E51B                                               ;返回继续循环
  80. 0041E559  xor     eax, eax
  81. 0041E55B  push    edx
  82. 0041E55C  mov     ecx, ebp
  83. 0041E55E  push    eax
  84. 0041E55F  lea     edx, dword ptr [41E580]
  85. 0041E565  call    0041C5AF
  86. 0041E56A  pop     eax
  87. 0041E56B  pop     edx
  88. 0041E56C  pop     edi
  89. 0041E56D  pop     esi
  90. 0041E56E  pop     ebx
  91. 0041E56F  add     esp, 108
  92. 0041E575  cmp     ebp, esp
  93. 0041E577  call    0041CD7A
  94. 0041E57C  mov     esp, ebp
  95. 0041E57E  pop     ebp
  96. 0041E57F  retn
复制代码


*********************************************************
注:在bbs.chinadbg.cn上正在举行基础算法学习活动,欢迎大家来玩
by kill203

[ 本帖最后由 kill203 于 2007-8-9 19:53 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2007-8-24 09:00:30 | 显示全部楼层
辛苦了,支持楼主分享。
PYG19周年生日快乐!

该用户从未签到

发表于 2007-8-24 19:46:15 | 显示全部楼层
高手,膜拜/:good
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2019-7-5 06:17
  • 签到天数: 97 天

    [LV.6]常住居民II

    发表于 2007-8-26 02:39:03 | 显示全部楼层
    辛苦了,学习中....
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    前天 09:19
  • 签到天数: 1087 天

    [LV.10]以坛为家III

    发表于 2007-9-19 17:44:27 | 显示全部楼层
    偶曾经也有这样的想法,但生性愚钝,玩不来——崇拜ing

    [ 本帖最后由 lianglc 于 2007-9-19 17:46 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表