多条件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) {
0041456C 83 7D F8 00 cmp dword ptr [ebp-8],0
00414570 7C 15 jl 00414587
00414572 83 7D 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 417B30h
0041457D E8 4B CB FF FF call 004110CD
00414582 83 C4 04 add esp,4
8: }
00414585 EB 3D jmp 004145C4
9: else if (a == 1) {
00414587 83 7D F8 01 cmp dword ptr [ebp-8],1
0041458B 75 0F jne 0041459C
10: printf("a is 1\n");
0041458D 68 3C 7B 41 00 push 417B3Ch
00414592 E8 36 CB FF FF call 004110CD
00414597 83 C4 04 add esp,4
11: }
0041459A EB 28 jmp 004145C4
12: else if (a >= 2 && a < 4) {
0041459C 83 7D F8 02 cmp dword ptr [ebp-8],2
004145A0 7C 15 jl 004145B7
004145A2 83 7D F8 04 cmp dword ptr [ebp-8],4
004145A6 7D 0F jge 004145B7
13: printf("a is 2\n");
004145A8 68 48 7B 41 00 push 417B48h
004145AD E8 1B CB FF FF call 004110CD
004145B2 83 C4 04 add esp,4
14: }
004145B5 EB 0D jmp 004145C4
15: else {
16: printf("error\n");
004145B7 68 54 7B 41 00 push 417B54h
004145BC E8 0C CB FF FF call 004110CD
004145C1 83 C4 04 add esp,4
17: }
18: }
004145C4 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;
00411FC5 C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0
22: int b = 1;
00411FCC C7 45 EC 01 00 00 00 mov dword ptr [ebp-14h],1
23: int c = 2;
00411FD3 C7 45 E0 02 00 00 00 mov dword ptr [ebp-20h],2
24: int d = a>b ? a : b;
00411FDA 8B 45 F8 mov eax,dword ptr [ebp-8]
00411FDD 3B 45 EC cmp eax,dword ptr [ebp-14h]
00411FE0 7E 0B jle 00411FED

00411FE2 8B 4D F8 mov ecx,dword ptr [ebp-8]
00411FE5 89 8D 0C FF FF FF mov dword ptr [ebp+FFFFFF0Ch],ecx

00411FEB EB 09 jmp 00411FF6
00411F ED 8B 55 EC mov edx,dword ptr [ebp-14h]
00411FF0 89 95 0C FF FF FF mov dword ptr [ebp+FFFFFF0Ch],edx

00411FF6 8B 85 0C FF FF FF mov eax,dword ptr [ebp+FFFFFF0Ch]
00411FFC 89 45 D4 mov dword ptr [ebp-2Ch],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;
004118F5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1
30: switch (a)
004118FC 8B 45 F8 mov eax,dword ptr [ebp-8]
004118FF 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax

00411905 83 BD 30 FF FF FF 01 cmp dword ptr [ebp+FFFFFF30h],1
0041190C 74 14 je 00411922
0041190E 83 BD 30 FF FF FF 02 cmp dword ptr [ebp+FFFFFF30h],2
00411915 74 1A je 00411931
00411917 83 BD 30 FF FF FF 03 cmp dword ptr [ebp+FFFFFF30h],3
0041191E 74 20 je 00411940
00411920 EB 2D jmp 0041194F
31: {
32: case 1:
33: printf("a is 1\n");
00411922 68 3C 7B 41 00 push 417B3Ch
00411927 E8 A1 F7 FF FF call 004110CD
0041192C 83 C4 04 add esp,4
34: break;
0041192F EB 2B jmp 0041195C
35: case 2:
36: printf("a is 2\n");
00411931 68 48 7B 41 00 push 417B48h
00411936 E8 92 F7 FF FF call 004110CD
0041193B 83 C4 04 add esp,4
37: break;
0041193E EB 1C jmp 0041195C
38: case 3:
39: printf("a is 3\n");
00411940 68 5C 7B 41 00 push 417B5Ch
00411945 E8 83 F7 FF FF call 004110CD
0041194A 83 C4 04 add esp,4
40: break;
0041194D EB 0D jmp 0041195C
41: default:
42: printf("error\n");
0041194F 68 54 7B 41 00 push 417B54h
00411954 E8 74 F7 FF FF call 004110CD
00411959 83 C4 04 add esp,4
43: break;
44: }
45: }
0041195C 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
//int ntemp = 1
004118E5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1

//switchavr = ntemp
004118EC 8B 45 F8 mov eax,dword ptr [ebp-8]
004118EF 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax

//switchavr -= 1
004118F5 8B 8D 30 FF FF FF mov ecx,dword ptr [ebp+FFFFFF30h]
004118FB 83 E9 01 sub ecx,1 // add/sub ecx,|case(min)|
004118FE 89 8D 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],ecx

//比较switchavr和case(max)-1
00411904 83 BD 30 FF FF FF 04 cmp dword ptr [ebp+FFFFFF30h],4 // 4 == case(max) +/- |case(min)|
0041190B 77 58 ja 00411965

0041190D 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+00411988h]

//跳转表
0x00411988 1a 19 41 00
0x0041198C 29 19 41 00
0x00411990 38 19 41 00
0x00411994 47 19 41 00
0x00411998 56 19 41 00

//case 1
0041191A 68 3C 7B 41 00 push 417B3Ch
0041191F E8 A9 F7 FF FF call 004110CD
00411924 83 C4 04 add esp,4
00411927 EB 49 jmp 00411972
//case 2
00411929 68 48 7B 41 00 push 417B48h
0041192E E8 9A F7 FF FF call 004110CD
00411933 83 C4 04 add esp,4
00411936 EB 3A jmp 00411972
//case 3
00411938 68 5C 7B 41 00 push 417B5Ch
0041193D E8 8B F7 FF FF call 004110CD
00411942 83 C4 04 add esp,4
00411945 EB 2B jmp 00411972
//case 4
00411947 68 04 7C 41 00 push 417C04h
0041194C E8 7C F7 FF FF call 004110CD
00411951 83 C4 04 add esp,4
00411954 EB 1C jmp 00411972
//case 5
00411956 68 0C 7C 41 00 push 417C0Ch
0041195B E8 6D F7 FF FF call 004110CD
00411960 83 C4 04 add esp,4
00411963 EB 0D jmp 00411972
//default
00411965 68 54 7B 41 00 push 417B54h
0041196A E8 5E F7 FF FF call 004110CD
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  
0041544C 8B 45 F8 mov eax,dword ptr [ebp-8]
0041544F 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax

00415455 8B 8D 30 FF FF FF mov ecx,dword ptr [ebp+FFFFFF30h]
0041545B 83 E9 03 sub ecx,3
0041545E 89 8D 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],ecx

00415464 83 BD 30 FF FF FF 11 cmp dword ptr [ebp+FFFFFF30h],11h
0041546B 0F 87 8C 00 00 00 ja 004154FD

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+00415544h]

//索引表
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 cc

0041547E FF 24 85 20 55 41 00 jmp dword ptr [eax*4+00415520h]

//跳转表
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

//case 3
00415485 68 48 7B 41 00 push 417B48h
0041548A E8 3E BC FF FF call 004110CD
0041548F 83 C4 04 add esp,4
00415492 EB 76 jmp 0041550A
//case 4
00415494 68 5C 7B 41 00 push 417B5Ch
00415499 E8 2F BC FF FF call 004110CD
0041549E 83 C4 04 add esp,4
004154A1 EB 67 jmp 0041550A
//case 5
004154A3 68 04 7C 41 00 push 417C04h
004154A8 E8 20 BC FF FF call 004110CD
004154AD 83 C4 04 add esp,4
004154B0 EB 58 jmp 0041550A
//case 11
004154B2 68 0C 7C 41 00 push 417C0Ch
004154B7 E8 11 BC FF FF call 004110CD
004154BC 83 C4 04 add esp,4
004154BF EB 49 jmp 0041550A
//case 12
004154C1 68 14 7C 41 00 push 417C14h
004154C6 E8 02 BC FF FF call 004110CD
004154CB 83 C4 04 add esp,4
004154CE EB 3A jmp 0041550A
//case 13
004154D0 68 1C 7C 41 00 push 417C1Ch
004154D5 E8 F3 BB FF FF call 004110CD
004154DA 83 C4 04 add esp,4
004154DD EB 2B jmp 0041550A
//case 19
004154DF 68 08 7D 41 00 push 417D08h
004154E4 E8 E4 BB FF FF call 004110CD
004154E9 83 C4 04 add esp,4
004154EC EB 1C jmp 0041550A
//case 20
004154EE 68 24 7D 41 00 push 417D24h
004154F3 E8 D5 BB FF FF call 004110CD
004154F8 83 C4 04 add esp,4
004154FB EB 0D jmp 0041550A
//default
004154FD 68 54 7B 41 00 push 417B54h
00415502 E8 C6 BB FF FF call 004110CD
00415507 83 C4 04 add esp,4
0041550A 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
004119C5 C7 45 F8 01 00 00 00 mov         dword ptr [ebp-8],1  
// 回到此处
004119CC 83 7D F8 0A cmp dword ptr [ebp-8],0Ah
004119D0 7F 0B jg 004119DD
004119D2 8B 45 F8 mov eax,dword ptr [ebp-8]
004119D5 83 C0 01 add eax,1
004119D8 89 45 F8 mov dword ptr [ebp-8],eax
004119DB EB EF jmp 004119CC

004119DD 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  
// 回到此外
0041219C 8B 45 F8 mov eax,dword ptr [ebp-8]
0041219F 50 push eax
004121A0 68 10 7D 41 00 push 417D10h
004121A5 E8 23 EF FF FF call 004110CD
004121AA 83 C4 08 add esp,8
004121AD 8B 45 F8 mov eax,dword ptr [ebp-8]
004121B0 83 C0 01 add eax,1
004121B3 89 45 F8 mov dword ptr [ebp-8],eax

004121B6 83 7D F8 0A cmp dword ptr [ebp-8],0Ah
004121BA 7E E0 jle 0041219C

004121BC 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
// int ntemp = 1
004118E5 C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1
004118EC EB 09 jmp 004118F7
// a++
004118EE 8B 45 F8 mov eax,dword ptr [ebp-8]
004118F1 83 C0 01 add eax,1
004118F4 89 45 F8 mov dword ptr [ebp-8],eax
// a<=10
004118F7 83 7D F8 0A cmp dword ptr [ebp-8],0Ah
004118FB 7F 13 jg 00411910
// 执行for内部代码
004118FD 8B 45 F8 mov eax,dword ptr [ebp-8]
00411900 50 push eax
00411901 68 10 7D 41 00 push 417D10h
00411906 E8 C2 F7 FF FF call 004110CD
0041190B 83 C4 08 add esp,8
0041190E EB DE jmp 004118EE

00411910 5F pop edi