- if-else依次不断比较;switch直接计算相对地址,条件较少时与if-else差不多
int main()
{
00F31070 push ebp
00F31071 mov ebp,esp
00F31073 sub esp,0Ch
int no = 4;
00F31076 mov dword ptr [no],4
switch (no) {
00F3107D mov eax,dword ptr [no]
00F31080 mov dword ptr [ebp-4],eax
00F31083 mov ecx,dword ptr [ebp-4]
00F31086 sub ecx,1
00F31089 mov dword ptr [ebp-4],ecx
00F3108C cmp dword ptr [ebp-4],4
00F31090 ja $LN8+0Fh (0F310E7h)
00F31092 mov edx,dword ptr [ebp-4]
00F31095 jmp dword ptr [edx*4+0F31104h]
case 1:
printf("no is 1\n");
00F3109C push 0F32100h
00F310A1 call printf (0F31010h)
00F310A6 add esp,4
break;
00F310A9 jmp $LN8+1Ch (0F310F4h)
case 2:
printf("no is 2\n");
00F310AB push 0F3210Ch
00F310B0 call printf (0F31010h)
00F310B5 add esp,4
break;
00F310B8 jmp $LN8+1Ch (0F310F4h)
case 3:
printf("no is 3\n");
00F310BA push 0F32118h
00F310BF call printf (0F31010h)
00F310C4 add esp,4
break;
00F310C7 jmp $LN8+1Ch (0F310F4h)
case 4:
printf("no is 4\n");
00F310C9 push 0F32124h
00F310CE call printf (0F31010h)
00F310D3 add esp,4
break;
00F310D6 jmp $LN8+1Ch (0F310F4h)
case 5:
printf("no is 5\n");
00F310D8 push 0F32130h
00F310DD call printf (0F31010h)
00F310E2 add esp,4
break;
00F310E5 jmp $LN8+1Ch (0F310F4h)
default:
printf("no is other\n");
00F310E7 push 0F3213Ch
00F310EC call printf (0F31010h)
00F310F1 add esp,4
break;
}
int b = 3;
00F310F4 mov dword ptr [b],3
return 0;
00F310FB xor eax,eax
}
int no = 4;
switch (no) {
case 3:
printf("no is 3\n");
break;
case 5:
printf("no is 5\n");
break;
case 7:
printf("no is 7\n");
break;
case 9:
printf("no is 9\n");
break;
case 10:
printf("no is 10\n");
break;
default:
printf("no is other\n");
break;
}
009E107D mov eax,dword ptr [no]
009E1080 mov dword ptr [ebp-4],eax
009E1083 mov ecx,dword ptr [ebp-4]
009E1086 sub ecx,3
009E1089 mov dword ptr [ebp-4],ecx
009E108C cmp dword ptr [ebp-4],7
009E1090 ja $LN8+0Fh (09E10E7h)
009E1092 mov edx,dword ptr [ebp-4]
009E1095 jmp dword ptr [edx*4+9E1104h]
switch (no) {
case 3:
printf("no is 3\n");
break;
case 5:
printf("no is 5\n");
break;
case 20:
printf("no is 20\n");
break;
case 22:
printf("no is 22\n");
break;
case 23:
printf("no is 23\n");
break;
default:
printf("no is other\n");
break;
}
switch (no) {
004A107D mov eax,dword ptr [no]
004A1080 mov dword ptr [ebp-4],eax
004A1083 mov ecx,dword ptr [ebp-4]
004A1086 sub ecx,3
004A1089 mov dword ptr [ebp-4],ecx
004A108C cmp dword ptr [ebp-4],14h
004A1090 ja $LN9 (04A10EEh)
004A1092 mov edx,dword ptr [ebp-4]
004A1095 movzx eax,byte ptr [edx+4A1120h]
004A109C jmp dword ptr [eax*4+4A1108h]
- 跨度非常大switch和if-else差不多,不优化