多条件if跳转 1 2 3 4 5 6 7 8 9 10 11 12 13 int a = 0 ;if (a >= 0 && a != 3 ) { printf ("a is 0\n" ); } else if (a == 1 ) { printf ("a is 1\n" ); } else if (a >= 2 && a < 4 ) { printf ("a is 2\n" ); } else { printf ("error\n" ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 5 : int a = 0 ; 00414565 C7 45 F8 00 00 00 00 mov dword ptr [ebp-8 ],0 6 : if (a >= 0 && a != 3 ) { 0041456 C 83 7 D F8 00 cmp dword ptr [ebp-8 ],0 00414570 7 C 15 jl 00414587 00414572 83 7 D F8 03 cmp dword ptr [ebp-8 ],3 00414576 74 0F je 00414587 7 : printf ("a is 0\n" ); 00414578 68 30 7B 41 00 push 417B 30h 0041457 D E8 4B CB FF FF call 004110 CD 00414582 83 C4 04 add esp,4 8 : } 00414585 EB 3 D jmp 004145 C4 9 : else if (a == 1 ) { 00414587 83 7 D F8 01 cmp dword ptr [ebp-8 ],1 0041458B 75 0F jne 0041459 C 10 : printf ("a is 1\n" ); 0041458 D 68 3 C 7B 41 00 push 417B 3Ch 00414592 E8 36 CB FF FF call 004110 CD 00414597 83 C4 04 add esp,4 11 : } 0041459 A EB 28 jmp 004145 C4 12 : else if (a >= 2 && a < 4 ) { 0041459 C 83 7 D F8 02 cmp dword ptr [ebp-8 ],2 004145 A0 7 C 15 jl 004145B 7 004145 A2 83 7 D F8 04 cmp dword ptr [ebp-8 ],4 004145 A6 7 D 0F jge 004145B 7 13 : printf ("a is 2\n" ); 004145 A8 68 48 7B 41 00 push 417B 48h 004145 AD E8 1B CB FF FF call 004110 CD 004145B 2 83 C4 04 add esp,4 14 : } 004145B 5 EB 0 D jmp 004145 C4 15 : else { 16 : printf ("error\n" ); 004145B 7 68 54 7B 41 00 push 417B 54h 004145B C E8 0 C CB FF FF call 004110 CD 004145 C1 83 C4 04 add esp,4 17 : } 18 : } 004145 C4 5F pop edi
3目运算符 1 2 3 4 int a = 0 ;int b = 1 ;int c = 2 ;int d = a>b ? a : b;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 21 : int a = 0 ; 00411F C5 C7 45 F8 00 00 00 00 mov dword ptr [ebp-8 ],0 22 : int b = 1 ; 00411F CC C7 45 EC 01 00 00 00 mov dword ptr [ebp-14 h],1 23 : int c = 2 ; 00411F D3 C7 45 E0 02 00 00 00 mov dword ptr [ebp-20 h],2 24 : int d = a>b ? a : b; 00411F DA 8B 45 F8 mov eax,dword ptr [ebp-8 ] 00411F DD 3B 45 EC cmp eax,dword ptr [ebp-14 h] 00411F E0 7 E 0B jle 00411F ED 00411F E2 8B 4 D F8 mov ecx,dword ptr [ebp-8 ] 00411F E5 89 8 D 0 C FF FF FF mov dword ptr [ebp+FFFFFF0Ch],ecx00411F EB EB 09 jmp 00411F F6 00411F ED 8B 55 EC mov edx,dword ptr [ebp-14 h] 00411F F0 89 95 0 C FF FF FF mov dword ptr [ebp+FFFFFF0Ch],edx 00411F F6 8B 85 0 C FF FF FF mov eax,dword ptr [ebp+FFFFFF0Ch] 00411F FC 89 45 D4 mov dword ptr [ebp-2 Ch],eax 25 : 26 : }
switch case语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int a = 1 ;switch (a){ case 1 : printf ("a is 1\n" ); break ; case 2 : printf ("a is 2\n" ); break ; case 3 : printf ("a is 3\n" ); break ; default : printf ("error\n" ); break ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 29 : int a = 1 ; 004118F 5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 30 : switch (a) 004118F C 8B 45 F8 mov eax,dword ptr [ebp-8 ] 004118F F 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax00411905 83 BD 30 FF FF FF 01 cmp dword ptr [ebp+FFFFFF30h],1 0041190 C 74 14 je 00411922 0041190 E 83 BD 30 FF FF FF 02 cmp dword ptr [ebp+FFFFFF30h],2 00411915 74 1 A je 00411931 00411917 83 BD 30 FF FF FF 03 cmp dword ptr [ebp+FFFFFF30h],3 0041191 E 74 20 je 00411940 00411920 EB 2 D jmp 0041194F 31 : { 32 : case 1 : 33 : printf ("a is 1\n" ); 00411922 68 3 C 7B 41 00 push 417B 3Ch 00411927 E8 A1 F7 FF FF call 004110 CD 0041192 C 83 C4 04 add esp,4 34 : break ; 0041192F EB 2B jmp 0041195 C 35 : case 2 : 36 : printf ("a is 2\n" ); 00411931 68 48 7B 41 00 push 417B 48h 00411936 E8 92 F7 FF FF call 004110 CD 0041193B 83 C4 04 add esp,4 37 : break ; 0041193 E EB 1 C jmp 0041195 C 38 : case 3 : 39 : printf ("a is 3\n" ); 00411940 68 5 C 7B 41 00 push 417B 5Ch 00411945 E8 83 F7 FF FF call 004110 CD 0041194 A 83 C4 04 add esp,4 40 : break ; 0041194 D EB 0 D jmp 0041195 C 41 : default : 42 : printf ("error\n" ); 0041194F 68 54 7B 41 00 push 417B 54h 00411954 E8 74 F7 FF FF call 004110 CD 00411959 83 C4 04 add esp,4 43 : break ; 44 : } 45 : } 0041195 C 5F pop edi
Tips
可以发现switch case和多条件if有异同
相同:都是 cmp je …… jmp 这种结构
不同:switch case 刚开始会出现 cmp je 多次重复的结构,if 判断条件如果有 && 这种也会出现,但是 if 的 后面的 je 跳转的地址都是相同的 ,但是switch 出现的 cmp je 的每个地址都是不相同的。
switch case 跳转表(case >= 4个) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int a = 1 ; switch (a) { case 1 : printf ("a is 1\n" ); break ; case 2 : printf ("a is 2\n" ); break ; case 3 : printf ("a is 3\n" ); break ; case 4 : printf ("a is 4\n" ); break ; case 5 : printf ("a is 5\n" ); break ; default : printf ("error\n" ); break ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 004118E5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 004118 EC 8B 45 F8 mov eax,dword ptr [ebp-8 ] 004118 EF 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax004118F 5 8B 8 D 30 FF FF FF mov ecx,dword ptr [ebp+FFFFFF30h] 004118F B 83 E9 01 sub ecx,1 004118F E 89 8 D 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],ecx 00411904 83 BD 30 FF FF FF 04 cmp dword ptr [ebp+FFFFFF30h],4 0041190B 77 58 ja 00411965 0041190 D 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h] 00411913 FF 24 95 88 19 41 00 jmp dword ptr [edx*4 +00411988 h] 0x00411988 1 a 19 41 00 0x0041198C 29 19 41 00 0x00411990 38 19 41 00 0x00411994 47 19 41 00 0x00411998 56 19 41 00 0041191 A 68 3 C 7B 41 00 push 417B 3Ch 0041191F E8 A9 F7 FF FF call 004110 CD 00411924 83 C4 04 add esp,4 00411927 EB 49 jmp 00411972 00411929 68 48 7B 41 00 push 417B 48h 0041192 E E8 9 A F7 FF FF call 004110 CD 00411933 83 C4 04 add esp,4 00411936 EB 3 A jmp 00411972 00411938 68 5 C 7B 41 00 push 417B 5Ch 0041193 D E8 8B F7 FF FF call 004110 CD 00411942 83 C4 04 add esp,4 00411945 EB 2B jmp 00411972 00411947 68 04 7 C 41 00 push 417 C04h 0041194 C E8 7 C F7 FF FF call 004110 CD 00411951 83 C4 04 add esp,4 00411954 EB 1 C jmp 00411972 00411956 68 0 C 7 C 41 00 push 417 C0Ch 0041195B E8 6 D F7 FF FF call 004110 CD 00411960 83 C4 04 add esp,4 00411963 EB 0 D jmp 00411972 00411965 68 54 7B 41 00 push 417B 54h 0041196 A E8 5 E F7 FF FF call 004110 CD 0041196F 83 C4 04 add esp,4 00411972 5F pop edi
switch case 索引表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 int a = 1 ;switch (a){ case 3 : printf ("a is 2\n" ); break ; case 4 : printf ("a is 3\n" ); break ; case 5 : printf ("a is 4\n" ); break ; case 11 : printf ("a is 5\n" ); break ; case 12 : printf ("a is 6\n" ); break ; case 13 : printf ("a is 7\n" ); break ; case 19 : printf ("a is 8\n" ); break ; case 20 : printf ("a is 10\n" ); break ; default : printf ("error\n" ); break ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 00415445 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 0041544 C 8B 45 F8 mov eax,dword ptr [ebp-8 ] 0041544F 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax 00415455 8B 8 D 30 FF FF FF mov ecx,dword ptr [ebp+FFFFFF30h] 0041545B 83 E9 03 sub ecx,3 0041545 E 89 8 D 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],ecx 00415464 83 BD 30 FF FF FF 11 cmp dword ptr [ebp+FFFFFF30h],11 h 0041546B 0F 87 8 C 00 00 00 ja 004154F D 00415471 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h] 00415477 0F B6 82 44 55 41 00 movzx eax,byte ptr [edx+00415544 h] 0x00415544 00 01 02 08 08 08 08 08 0x0041554C 03 04 05 08 08 08 08 08 0x00415554 06 07 cc cc cc cc cc cc0041547 E FF 24 85 20 55 41 00 jmp dword ptr [eax*4 +00415520 h] 0x00415520 85 54 41 00 0x00415524 94 54 41 00 0x00415528 a3 54 41 00 0x0041552C b2 54 41 00 0x00415530 c1 54 41 00 0x00415534 d0 54 41 00 0x00415538 df 54 41 00 0x0041553C ee 54 41 00 0x00415540 fd 54 41 00 00415485 68 48 7B 41 00 push 417B 48h 0041548 A E8 3 E BC FF FF call 004110 CD 0041548F 83 C4 04 add esp,4 00415492 EB 76 jmp 0041550 A 00415494 68 5 C 7B 41 00 push 417B 5Ch 00415499 E8 2F BC FF FF call 004110 CD 0041549 E 83 C4 04 add esp,4 004154 A1 EB 67 jmp 0041550 A 004154 A3 68 04 7 C 41 00 push 417 C04h 004154 A8 E8 20 BC FF FF call 004110 CD 004154 AD 83 C4 04 add esp,4 004154B 0 EB 58 jmp 0041550 A004154B 2 68 0 C 7 C 41 00 push 417 C0Ch 004154B 7 E8 11 BC FF FF call 004110 CD 004154B C 83 C4 04 add esp,4 004154B F EB 49 jmp 0041550 A004154 C1 68 14 7 C 41 00 push 417 C14h 004154 C6 E8 02 BC FF FF call 004110 CD 004154 CB 83 C4 04 add esp,4 004154 CE EB 3 A jmp 0041550 A004154 D0 68 1 C 7 C 41 00 push 417 C1Ch 004154 D5 E8 F3 BB FF FF call 004110 CD 004154 DA 83 C4 04 add esp,4 004154 DD EB 2B jmp 0041550 A 004154 DF 68 08 7 D 41 00 push 417 D08h 004154E4 E8 E4 BB FF FF call 004110 CD 004154E9 83 C4 04 add esp,4 004154 EC EB 1 C jmp 0041550 A004154 EE 68 24 7 D 41 00 push 417 D24h 004154F 3 E8 D5 BB FF FF call 004110 CD 004154F 8 83 C4 04 add esp,4 004154F B EB 0 D jmp 0041550 A004154F D 68 54 7B 41 00 push 417B 54h 00415502 E8 C6 BB FF FF call 004110 CD 00415507 83 C4 04 add esp,4 0041550 A 5F pop edi
wile 循环 1 2 3 4 5 int a = 1 ;while (a <= 10 ){ a++; }
1 2 3 4 5 6 7 8 9 10 004119 C5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 004119 CC 83 7 D F8 0 A cmp dword ptr [ebp-8 ],0 Ah 004119 D0 7F 0B jg 004119 DD 004119 D2 8B 45 F8 mov eax,dword ptr [ebp-8 ] 004119 D5 83 C0 01 add eax,1 004119 D8 89 45 F8 mov dword ptr [ebp-8 ],eax 004119 DB EB EF jmp 004119 CC 004119 DD 5F pop edi
do while循环 1 2 3 4 5 int a = 1 ;do { printf ("%d \n" , a); a++; } while (a <= 10 );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 00412195 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 0041219 C 8B 45 F8 mov eax,dword ptr [ebp-8 ] 0041219F 50 push eax 004121 A0 68 10 7 D 41 00 push 417 D10h 004121 A5 E8 23 EF FF FF call 004110 CD 004121 AA 83 C4 08 add esp,8 004121 AD 8B 45 F8 mov eax,dword ptr [ebp-8 ] 004121B 0 83 C0 01 add eax,1 004121B 3 89 45 F8 mov dword ptr [ebp-8 ],eax 004121B 6 83 7 D F8 0 A cmp dword ptr [ebp-8 ],0 Ah 004121B A 7 E E0 jle 0041219 C 004121B C 5F pop edi
for循环 1 2 3 4 for (int a = 1 ; a <= 10 ; a++){ printf ("%d \n" , a); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 004118E5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8 ],1 004118 EC EB 09 jmp 004118F 7 004118 EE 8B 45 F8 mov eax,dword ptr [ebp-8 ] 004118F 1 83 C0 01 add eax,1 004118F 4 89 45 F8 mov dword ptr [ebp-8 ],eax 004118F 7 83 7 D F8 0 A cmp dword ptr [ebp-8 ],0 Ah 004118F B 7F 13 jg 00411910 004118F D 8B 45 F8 mov eax,dword ptr [ebp-8 ] 00411900 50 push eax 00411901 68 10 7 D 41 00 push 417 D10h 00411906 E8 C2 F7 FF FF call 004110 CD 0041190B 83 C4 08 add esp,8 0041190 E EB DE jmp 004118 EE 00411910 5F pop edi