首页
社区
课程
招聘
菜鸟求教 release版本的for循环反汇编
发表于: 2013-2-28 22:56 3427

菜鸟求教 release版本的for循环反汇编

2013-2-28 22:56
3427
VS2010自带反汇编代码:
for(i=-100;i<100;++i)
000A1008  mov         eax,0FFFFFF9Ch  
000A100D  xor         edx,edx  
000A100F  nop  
  {
    sum+=i;
000A1010  add         ecx,eax  
000A1012  lea         edx,[edx+eax+1]  
000A1016  lea         esi,[esi+eax+2]  
000A101A  lea         edi,[edi+eax+3]  
000A101E  add         eax,4  
000A1021  cmp         eax,64h  
000A1024  jl          main+10h (0A1010h)  
  }
——————————————————————————————————
while(i<=100)
        {
                sum+=i;
000A1035  add         ecx,eax  
000A1037  lea         edx,[edx+eax+1]  
000A103B  lea         esi,[esi+eax+2]  
000A103F  add         eax,3  
000A1042  cmp         eax,64h  
000A1045  jle         main+35h (0A1035h)  
————————————————————————————————————
1、我知道LEA这个指令的作用  但是反汇编后这三个指令是干嘛的?并没看到这个循环体内哪里用到EDX\ESI\EDI了啊。。。。

2、EAX中存放的是I的值 为什么i++反汇编后是add         eax,4  ?

3、for循环中还是加4  怎么 while循环中就变成了3?
DEBUG版本可以看懂 不过一到了这个版本就蒙了   毕竟真正破解的时候都是发行版。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 455
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
sum+=i;
000A1010  add         ecx,eax               
000A1012  lea         edx,[edx+eax+1]  
000A1016  lea         esi,[esi+eax+2]   
000A101A  lea         edi,[edi+eax+3]   
000A101E  add         eax,4                  
000A1021  cmp         eax,64h  
000A1024  jl          main+10h (0A1010h)  
  }
lea实现加法 编译器优化 4个为一组处理 edx esi edi 间接实现加法,
和优化原则有关系,前面要算200次,后面要算201次
2013-3-1 01:02
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
/O2
1) 为了减少循环次数
2) Intel对于自家的lea指令很是得意

for (i = 0; i < 100; ++i) {
        sum += i;
}

for (i = 0; i < 100 ; i+=4) {
        sum   += i;
        sum1 += i+1;
        sum2 += i+2;
        sum3 += i+3;
}
sum+=sum1+sum2+sum3;

sum123就分别对应了edx,esi,edi
2013-3-1 01:04
0
游客
登录 | 注册 方可回帖
返回
//