kill203 发表于 2007-8-9 19:41:44

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

我的第一个C++程序

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


void main()
{
      int i,j,arr;
      for(i=0;i<10;i++)
      {
                cout<<"请输入10个整数:";
                cin>>arr;
    }
      for(i=0;i<10;i++)                         //数组数据的循环比较
      {      for(j=0;j<10-i-1;j++)    //每一轮的比较
         { if(arr<arr)       //比较相邻两个数大小
      {swap(arr,arr);    //互换函数的调用
                        
      }
      }
      }
      for(i=0;i<10;i++)
      {      cout<<"正确的从大到小的排序:"<<arr<<endl;
      }

}SWAP函数第二种实现及调用方法:void swap(int *a, int *b)
{int tem = *a;
*a = *b
*b = tem;
}
调用时是:swap(&arr,&arr)下面是对我这个程序的反汇编代码0041E450push    ebp                           ;从这里开始就是main()函数的开始
0041E451mov   ebp, esp
0041E453sub   esp, 108
0041E459push    ebx
0041E45Apush    esi
0041E45Bpush    edi
0041E45Clea   edi, dword ptr
0041E462mov   ecx, 42
0041E467mov   eax, CCCCCCCC
0041E46Crep   stos dword ptr es:
0041E46Emov   dword ptr , 0
0041E475jmp   short 0041E480
0041E477mov   eax, dword ptr                               ;eax就相当与i ,从这里开始循环
0041E47Aadd   eax, 1                                                      ;i++
0041E47Dmov   dword ptr , eax                              ;把i保存了
0041E480cmp   dword ptr , 0A   ;i与10比较
0041E484jge   short 0041E4AC                                        ;i大于10就跳
0041E486push    004570E4                                             ;请输入10个整数:
0041E48Bpush    004607D0            
0041E490call    0041CB6D                                                ;显示“请输入10个整数:”
0041E495add   esp, 8
0041E498mov   eax, dword ptr
0041E49Blea   ecx, dword ptr
0041E49Fpush    ecx
0041E4A0mov   ecx, 00460710
0041E4A5call    0041CAAA                                                 ;执行输入命令,相当与C++中的 cin<<arr
0041E4AAjmp   short 0041E477                                        ;跳回去循环


0041E4ACmov   dword ptr , 0                                 ;对i进行初始化
0041E4B3jmp   short 0041E4BE
0041E4B5mov   eax, dword ptr                               
0041E4B8add   eax, 1                                                         ;i++
0041E4BBmov   dword ptr , eax
0041E4BEcmp   dword ptr , 0A                              ;i与10比较
0041E4C2jge   short 0041E512                                           ;大于就跳
0041E4C4mov   dword ptr , 0                                 ;相当与对j初始化,j=0
0041E4CBjmp   short 0041E4D6
0041E4CDmov   eax, dword ptr                               
0041E4D0add   eax, 1                                                      ;j++
0041E4D3mov   dword ptr , eax                              
0041E4D6mov   eax, 0A                                                   ;从这里开始的三条指令其实就是10-i-1               
0041E4DBsub   eax, dword ptr
0041E4DEsub   eax, 1
0041E4E1cmp   dword ptr , eax                               ;这里就是j<10-i-1
0041E4E4jge   short 0041E510                                          ;大于就跳
0041E4E6mov   eax, dword ptr
0041E4E9mov   ecx, dword ptr
0041E4ECmov   edx, dword ptr
0041E4F0cmp   edx, dword ptr                      ;这里其实就是 if(arr<arr)      
0041E4F4jge   short 0041E50E                                             ;如果大于那么就不执行SWAP函数
0041E4F6mov   eax, dword ptr
0041E4F9lea   ecx, dword ptr
0041E4FDpush    ecx                                                             ;压入参数a
0041E4FEmov   edx, dword ptr
0041E501lea   eax, dword ptr
0041E505push    eax                                                            ;压入参数b
0041E506call    0041D20C                                                      ;这里就是SWAP互换函数
0041E50Badd   esp, 8
0041E50Ejmp   short 0041E4CD                                             ;返回进行for(j=0;j<10-i-1;j++) 循环
0041E510jmp   short 0041E4B5                                             ;返回进行for(i=0;i<10;i++) 循环


0041E512mov   dword ptr , 0                                    ;好了这里就是对最后一个循环的 i 初始化
0041E519jmp   short 0041E524
0041E51Bmov   eax, dword ptr
0041E51Eadd   eax, 1
0041E521mov   dword ptr , eax
0041E524cmp   dword ptr , 0A                                     ;比较 i<10
0041E528jge   short 0041E559                                                ;大于就跳
0041E52Apush    0041C505                                                       ;这个参数就是endl
0041E52Fmov   eax, dword ptr
0041E532mov   ecx, dword ptr
0041E536push    ecx
0041E537push    004570C8                                                      ;字符传“正确的从大到小的排序:”
0041E53Cpush    004607D0
0041E541call    0041CB6D                                                      ;这里还是显示字符串
0041E546add   esp, 8
0041E549mov   ecx, eax
0041E54Bcall    0041C631                                                      ;显示数据arr
0041E550mov   ecx, eax
0041E552call    0041CB9A                                                      ;将光标换行
0041E557jmp   short 0041E51B                                             ;返回继续循环
0041E559xor   eax, eax
0041E55Bpush    edx
0041E55Cmov   ecx, ebp
0041E55Epush    eax
0041E55Flea   edx, dword ptr
0041E565call    0041C5AF
0041E56Apop   eax
0041E56Bpop   edx
0041E56Cpop   edi
0041E56Dpop   esi
0041E56Epop   ebx
0041E56Fadd   esp, 108
0041E575cmp   ebp, esp
0041E577call    0041CD7A
0041E57Cmov   esp, ebp
0041E57Epop   ebp
0041E57Fretn

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

[ 本帖最后由 kill203 于 2007-8-9 19:53 编辑 ]

shenyun528 发表于 2007-8-24 09:00:30

辛苦了,支持楼主分享。

小子贼野 发表于 2007-8-24 19:46:15

高手,膜拜/:good

太星 发表于 2007-8-26 02:39:03

辛苦了,学习中....

lianglc 发表于 2007-9-19 17:44:27

偶曾经也有这样的想法,但生性愚钝,玩不来——崇拜ing

[ 本帖最后由 lianglc 于 2007-9-19 17:46 编辑 ]
页: [1]
查看完整版本: 从基础做起,一步一步来逆向!