C语言流程控制语句的反汇编分析
2013-03-19 11:34
99 查看
以下测试是在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。
相关文章推荐
- C语言中流程控制语句(if,switch,for,while,do-while,continue,break,return)
- C语言-流程控制语句
- 三 C语言流程控制语句
- C语言 流程控制语句
- C语言学习十流程控制的学习之分支语句
- 第四章c语言 流程控制语句(一)
- C语言语句及流程控制
- 黑马程序员——java基础——流程控制语句
- iOS开发分分钟搞定C语言 —— 流程控制
- Web17.JS数据类型/运算符/优先级/流程控制语句
- 黑马程序员------C语言-----流程控制(选择结构:if,switch)
- 轻松学习JavaScript七:JavaScript的流程控制语句
- JavaScript基础之流程控制语句
- MYSQL基础(视图、索引、存储过程与函数、流程控制语句)
- 我也要学C语言-第八章:流程控制与函数机制
- Shell编程-流程控制-if、case语句
- js 基础 -- 运算符、流程控制语句
- X264码率控制流程分析
- java基础59 JavaScript运算符与控制流程语句(网页知识)
- C语言的控制语句