提出问题:
- 为什么swittch语句只能判断
整型类型
的变量?
C++
void main(){
int flag;
flag = 20;
switch (flag)
{
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
case 3:
printf("3\n");
break;
case 4:
printf("4\n");
break;
case 5:
printf("5\n");
break;
default:
printf("%d\n", flag);
}
}
汇编
mov dword ptr [ebp-8],14h
mov eax,dword ptr [ebp-8]
mov dword ptr [ebp-4],eax
mov ecx,dword ptr [ebp-4]
sub ecx,1
mov dword ptr [ebp-4],ecx
cmp dword ptr [ebp-4],4
ja 009A10F7
mov edx,dword ptr [ebp-4]
jmp dword ptr [edx*4+009A1110h]
push 45DD58h
call 0045163B
add esp,4
jmp 004547F9
push 45DD60h
call 0045163B
add esp,4
jmp 004547F9
push 45DD6Ch
call 0045163B
add esp,4
jmp 004547F9
push 45DF88h
call 0045163B
add esp,4
jmp 004547F9
push 45DB40h
call 0045163B
add esp,4
jmp 004547F9
mov eax,dword ptr [ebp-8]
push eax
push 45DB58h
call 0045163B
add esp,8
机器码
00454768 C7 45 F8 14 00 00 00
0045476F 8B 45 F8
00454772 89 85 30 FF FF FF
00454778 8B 8D 30 FF FF FF
0045477E 83 E9 01
00454781 89 8D 30 FF FF FF
00454787 83 BD 30 FF FF FF 04
0045478E 77 58
00454790 8B 95 30 FF FF FF
00454796 FF 24 95 10 48 45 00
0045479D 68 58 DD 45 00
004547A2 E8 94 CE FF FF
004547A7 83 C4 04
004547AA EB 4D
004547AC 68 60 DD 45 00
004547B1 E8 85 CE FF FF
004547B6 83 C4 04
004547B9 EB 3E
004547BB 68 6C DD 45 00
004547C0 E8 76 CE FF FF
004547C5 83 C4 04
004547C8 EB 2F
004547CA 68 88 DF 45 00
004547CF E8 67 CE FF FF
004547D4 83 C4 04
004547D7 EB 20
004547D9 68 40 DB 45 00
004547DE E8 58 CE FF FF
004547E3 83 C4 04
004547E6 EB 11
004547E8 8B 45 F8
004547EB 50
004547EC 68 58 DB 45 00
004547F1 E8 45 CE FF FF
004547F6 83 C4 08
分析汇编:
具体值代入法:
flag = 1, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1110h
flag = 2, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1114h
flag = 3, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1118h
flag = 4, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C111ch
flag = 5, flag = flag - 1 flag<=4, 执行ja指令,地址:004547E8h
发现规律:switch语句的本质是把case的每一个地址存储在一个数组里,然后flag经过计算得出存储该地址的数组下标。
应用场景
当
内存
里的某个整型变量
根据不同的值
要执行不同的指令