在switch中,每两个case值之间的差值小于等于6,必须是序的线性表,并且case语句大于等于4,就会采用有序线性查表方式。
在我的电脑上 两个CASE之间的值大于6 为什么还编译器还采用索引表呢
63: int nIndex = 0;
00401006 mov dword ptr [nIndex],0
64: scanf("%d", &nIndex);
0040100D lea eax,[nIndex]
00401010 push eax
00401011 push offset ___xi_z+4 (00403010)
00401016 call dword ptr [__imp__scanf (00402004)]
0040101C add esp,8
65:
66:
67: switch(nIndex)
68: {
0040101F mov ecx,dword ptr [nIndex]
00401022 mov dword ptr [ebp-8],ecx
00401025 cmp dword ptr [ebp-8],0Ah
00401029 ja $L542+0Eh (0040107b)
0040102B mov eax,dword ptr [ebp-8]
0040102E xor edx,edx
00401030 mov dl,byte ptr (
00401093)[eax] ;
采用索引表
00401036 jmp dword ptr [edx*4+40107Fh]
69:
case 0:
70: printf("nIndex == 1");
0040103D push offset ___xi_z+8 (00403014)
00401042 call dword ptr [__imp__printf (00402000)]
00401048 add esp,4
71: break;
0040104B jmp $L542+0Eh (0040107b)
72:
case 8:
73: printf("nIndex == 4");
0040104D push offset ___xi_z+14h (00403020)
00401052 call dword ptr [__imp__printf (00402000)]
00401058 add esp,4
74: break;
0040105B jmp $L542+0Eh (0040107b)
75:
case 9:
76: printf("nIndex == 8");
0040105D push offset ___xi_z+20h (0040302c)
00401062 call dword ptr [__imp__printf (00402000)]
00401068 add esp,4
77: break;
0040106B jmp $L542+0Eh (0040107b)
78:
case 10:
79: printf("nIndex == 12");
0040106D push offset ___xi_z+2Ch (00403038)
00401072 call dword ptr [__imp__printf (00402000)]
00401078 add esp,4
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)