首页
社区
课程
招聘
新手求大神解释段反汇编代码
发表于: 2015-2-14 10:06 4199

新手求大神解释段反汇编代码

2015-2-14 10:06
4199
       
       for(i = 0; i < 10; i++)
00A013E5  mov         dword ptr [i],0  
00A013EC  jmp         wmain+37h (0A013F7h)  
00A013EE  mov         eax,dword ptr [i]  
00A013F1  add         eax,1  
00A013F4  mov         dword ptr [i],eax  
00A013F7  cmp         dword ptr [i],0Ah  
00A013FB  jge         wmain+5Ah (0A0141Ah)  
这是一段for循环的反汇编代码,指令是从上到下执行的,我有个疑问。
请问大神:当程序执行到第二句jmp指令时,程序跳转到cmp进行比较,然后结果通过jge进行跳转,但是如果jge跳转不成功,程序应该怎么执行?jmp跳转后,它下面的几句指令何时运行?求大神给解释下。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
2
jge后面是循环体内的内容
jmp后面的代码是对i进行自增1,自增1的内容是循环体执行完一次后执行
2015-2-14 10:21
0
雪    币: 12
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我来说说流程:
cmp         dword ptr [i],0Ah       //比较i是否大於10
jge         wmain+5Ah (0A0141Ah)   //大於或等於就跳出循环
你的代码不完整吧,应该在0a013FB到0a0141a这地址间的代码没贴出,应该是跳到i++这句话的
2015-2-14 10:25
0
雪    币: 84
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=pklong;1353691]我来说说流程:
cmp         dword ptr [i],0Ah       //比较i是否大於10
jge         wmain+5Ah (0A0141Ah)   //大於或等於就跳出循环
你的代码不完整吧,应该在0a013FB到0a0141a这地址间的代码没贴出,应该是跳...[/QUOTE]

没有了,就这一段代码,如果jpe不满足跳出循环条件的话,程序去哪执行?如果是去jmp下面执行的话,为什么?
2015-2-14 10:36
0
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
5
00A013FB  jge         wmain+5Ah (0A0141Ah)  ;退出循环
00A013FB 后面应该有向上跳转的代码 jmp A013EE

for(i = 0; i < 10; i++)后面是什么代码 jge 就跳去执行什么代码
2015-2-14 10:51
0
雪    币: 84
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
int _tmain(int argc, _TCHAR* argv[])
{
011713C0  push        ebp  
011713C1  mov         ebp,esp  
011713C3  sub         esp,0CCh  
011713C9  push        ebx  
011713CA  push        esi  
011713CB  push        edi  
011713CC  lea         edi,[ebp-0CCh]  
011713D2  mov         ecx,33h  
011713D7  mov         eax,0CCCCCCCCh  
011713DC  rep stos    dword ptr es:[edi]  
        int i = 0;
011713DE  mov         dword ptr [i],0  
        for(i = 0; i < 10; i++)
011713E5  mov         dword ptr [i],0  
011713EC  jmp         wmain+37h (11713F7h)  
011713EE  mov         eax,dword ptr [i]  
011713F1  add         eax,1  
011713F4  mov         dword ptr [i],eax  
011713F7  cmp         dword ptr [i],0Ah  
011713FB  jge         wmain+5Ah (117141Ah)  
        {
                printf("%d\n",i);
011713FD  mov         esi,esp  
011713FF  mov         eax,dword ptr [i]  
01171402  push        eax  
01171403  push        offset string "%d\n" (1175740h)  
01171408  call        dword ptr [__imp__printf (11782D4h)]  
0117140E  add         esp,8  
01171411  cmp         esi,esp  
01171413  call        @ILT+315(__RTC_CheckEsp) (1171140h)  
        }
01171418  jmp         wmain+2Eh (11713EEh)  
        scanf("");
0117141A  mov         esi,esp  
0117141C  push        offset string "" (117573Ch)  
01171421  call        dword ptr [__imp__scanf (11782DCh)]  
01171427  add         esp,4  
0117142A  cmp         esi,esp  
0117142C  call        @ILT+315(__RTC_CheckEsp) (1171140h)  
        return 0;
01171431  xor         eax,eax  
}
这是全部代码,jge后边没有跳转,难道被优化了?
2015-2-14 10:59
0
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=ccdy;1353701]int _tmain(int argc, _TCHAR* argv[])
{
011713C0  push        ebp  
011713C1  mov         ebp,esp  
011713C3  sub         esp,0CCh  
011713C9  pus...[/QUOTE]

01171418  jmp         wmain+2Eh (11713EEh)  这不就是吗
你这是明显没经过优化的代码
2015-2-14 11:01
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
8
for(i = 0; i < 10; i++)
011713E5  mov         dword ptr [i],0    //赋值 i=0
011713EC  jmp         wmain+37h (11713F7h)  //先进行条件检查于11713f7

011713EE  mov         eax,dword ptr [i]  
011713F1  add         eax,1  
011713F4  mov         dword ptr [i],eax  
011713F7  cmp         dword ptr [i],0Ah     //检查条件i<10
011713FB  jge         wmain+5Ah (117141Ah)  //跳转条件为大于或等于
  {
    printf("%d\n",i);
011713FD  mov         esi,esp    //如果未满足条件, 执行for循环体内的代码
011713FF  mov         eax,dword ptr [i]  
01171402  push        eax  
01171403  push        offset string "%d\n" (1175740h)  
01171408  call        dword ptr [__imp__printf (11782D4h)]  
0117140E  add         esp,8  
01171411  cmp         esi,esp  
01171413  call        @ILT+315(__RTC_CheckEsp) (1171140h)  
  }
01171418  jmp         wmain+2Eh (11713EEh)  //返回进行下一轮循环
  scanf("");
0117141A  mov         esi,esp   //如果满足条件,这里就已经循环.
0117141C  push        offset string "" (117573Ch)  
01171421  call        dword ptr [__imp__scanf (11782DCh)]  
01171427  add         esp,4  
0117142A  cmp         esi,esp  
0117142C  call        @ILT+315(__RTC_CheckEsp) (1171140h)  
  return 0;
01171431  xor         eax,eax  
}
2015-2-14 11:19
0
雪    币: 84
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
嗨,我这眼睛是出气的了,谢谢你了,朋友。
2015-2-14 11:22
0
游客
登录 | 注册 方可回帖
返回
//