C语言流程控制语句的反汇编分析

    以下测试是在vc6.0下进行的,主要有if、switch、for、while、do...while,下面依次分析:

1、if

20:       if(x == 0)
00401078   cmp         dword ptr [ebp+8],0
0040107C   jne         test_if+27h (00401087)
21:       {
22:           x =1;
0040107E   mov         dword ptr [ebp+8],1
23:       }
24:       else if(x > 0)
00401085   jmp         test_if+3Dh (0040109d)
00401087   cmp         dword ptr [ebp+8],0
0040108B   jle         test_if+36h (00401096)
25:       {
26:           x = 2;
0040108D   mov         dword ptr [ebp+8],2
27:       }
28:       else
00401094   jmp         test_if+3Dh (0040109d)
29:       {
30:           x =3;
00401096   mov         dword ptr [ebp+8],3
31:       }
由上面可以看出,if转移语句较多,分词很多的情况下,效率就不及switch了

2、switch

67:       switch(x)
68:       {
004010D8   mov         eax,dword ptr [ebp+8]
004010DB   mov         dword ptr [ebp-4],eax
004010DE   cmp         dword ptr [ebp-4],1
004010E2   je          test_switch+2Ch (004010ec)
004010E4   cmp         dword ptr [ebp-4],2
004010E8   je          test_switch+33h (004010f3)
004010EA   jmp         test_switch+3Ch (004010fc)
69:       case 1:
70:           x = 2;
004010EC   mov         dword ptr [ebp+8],2
71:       case 2:
72:           x = 3;
004010F3   mov         dword ptr [ebp+8],3
73:           break;
004010FA   jmp         test_switch+45h (00401105)
74:       default:
75:           x--;
004010FC   mov         ecx,dword ptr [ebp+8]
004010FF   sub         ecx,1
00401102   mov         dword ptr [ebp+8],ecx
76:       }
可以看出,switch转移语句个数是有限的,和分支数目多少是无关的,因为switch的策略是转移表的,所以能用switch尽量不用if

3、for

83:       for(i = 0 ;i <= x ;i++)
00401146   mov         dword ptr [ebp-8],0
0040114D   jmp         test_for+38h (00401158)
0040114F   mov         eax,dword ptr [ebp-8]
00401152   add         eax,1
00401155   mov         dword ptr [ebp-8],eax
00401158   mov         ecx,dword ptr [ebp-8]
0040115B   cmp         ecx,dword ptr [ebp+8]
0040115E   jg          test_for+4Bh (0040116b)
84:       {
85:           cnt++;
00401160   mov         edx,dword ptr [ebp-4]
00401163   add         edx,1
00401166   mov         dword ptr [ebp-4],edx
86:       }
00401169   jmp         test_for+2Fh (0040114f)
87:   }

4、while

91:       while(x >= 0)
0040D5D8   cmp         dword ptr [ebp+8],0
0040D5DC   jl          test_while+29h (0040d5e9)
92:       {
93:           x--;
0040D5DE   mov         eax,dword ptr [ebp+8]
0040D5E1   sub         eax,1
0040D5E4   mov         dword ptr [ebp+8],eax
94:       }
0040D5E7   jmp         test_while+18h (0040d5d8)
95:   }

5、do while

99:       do
100:      {
101:          x--;
0040D608   mov         eax,dword ptr [ebp+8]
0040D60B   sub         eax,1
0040D60E   mov         dword ptr [ebp+8],eax
102:      }while(x >= 0);
0040D611   cmp         dword ptr [ebp+8],0
0040D615   jge         test_do_while+18h (0040d608)
103:  }

总结:流程控制语句if效率偏低,能采取代替策略尽量代替。而且while、do while效率偏高于for,能用while尽量不用for。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值