您的位置:首页 > 其它

简单反汇编之狐狸吃兔子算法

2010-01-11 14:56 176 查看
今天拿狐狸吃兔子算法反了一下,特此坐下记录,算法源码:

http://blog.csdn.net/ms2146/archive/2009/12/25/5073360.aspx

Release版本反汇编分析:

00401000  /$  83EC 2C       SUB ESP,2C                           //开辟了11个堆栈空间
00401003  |.  33C0          XOR EAX,EAX
00401005  |.  56            PUSH ESI
00401006  |.  57            PUSH EDI
00401007  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX
0040100B  |.  894424 0C     MOV DWORD PTR SS:[ESP+C],EAX
0040100F  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
00401013  |.  894424 14     MOV DWORD PTR SS:[ESP+14],EAX
00401017  |.  894424 18     MOV DWORD PTR SS:[ESP+18],EAX
0040101B  |.  894424 1C     MOV DWORD PTR SS:[ESP+1C],EAX
0040101F  |.  894424 20     MOV DWORD PTR SS:[ESP+20],EAX
00401023  |.  894424 24     MOV DWORD PTR SS:[ESP+24],EAX
00401027  |.  894424 28     MOV DWORD PTR SS:[ESP+28],EAX
0040102B  |.  894424 2C     MOV DWORD PTR SS:[ESP+2C],EAX
0040102F  |.  894424 30     MOV DWORD PTR SS:[ESP+30],EAX //给前面开辟的11个堆栈空间赋值为eax=0;
00401033  |.  33C9          XOR ECX,ECX                   //ecx清零
00401035  |.  BE E8030000   MOV ESI,3E8                   //esi赋值1000
0040103A  |>  41            /INC ECX                      //ecx自增1
0040103B  |.  03C1          |ADD EAX,ECX                  //eax=eax+ecx
0040103D  |.  83F8 0A       |CMP EAX,0A                   //eax和10比较
00401040  |.  7E 0A         |JLE SHORT sftest.0040104C    //小于等于跳转到sftest.0040104C
00401042  |.  99            |CDQ                          //将edx至eax的符号位相同
00401043  |.  BF 0A000000   |MOV EDI,0A                   //edi赋值10
00401048  |.  F7FF          |IDIV EDI                     //eax/10
0040104A  |.  8BC2          |MOV EAX,EDX                  //取余给eax
0040104C  |>  8B7C84 08     |MOV EDI,DWORD PTR SS:[ESP+EAX*4+8]  //获取ESP+EAX*4+8可以看出每次改变的是eax,这里的eax是索引,后面乘4是因为以4字节为单位,加8是因为上面分配的数组是从esp+8开始的
00401050  |.  47            |INC EDI        //edi自增1
00401051  |.  4E            |DEC ESI        //循环变量esi总共循环1000次,这里是减一
00401052  |.  897C84 08     |MOV DWORD PTR SS:[ESP+EAX*4+8],EDI  //将计算好的edi在重复放入eax索引处的堆栈
00401056  |.^ 75 E2         /JNZ SHORT sftest.0040103A   //跳转上去继续循环
00401058  |.  8D7424 0C     LEA ESI,DWORD PTR SS:[ESP+C] //取数组第一个元素偏移
0040105C  |.  BF 0A000000   MOV EDI,0A
00401061  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]  //获取数组数据
00401063  |.  50            |PUSH EAX
00401064  |.  68 30704000   |PUSH sftest.00407030                    ;  ASCII "%d/n"
00401069  |.  E8 22000000   |CALL sftest.00401090
0040106E  |.  83C4 08       |ADD ESP,8
00401071  |.  83C6 04       |ADD ESI,4
00401074  |.  4F            |DEC EDI
00401075  |.^ 75 EA         /JNZ SHORT sftest.00401061
00401077  |.  5F            POP EDI
00401078  |.  5E            POP ESI
00401079  |.  83C4 2C       ADD ESP,2C     //清理堆栈
0040107C  /.  C3            RETN


over.................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: