int a = 0;
AB1448 mov dword ptr [a],0 //a初始化为0
scanf("%d\n", &a);
AB144F mov esi,esp
AB1451 lea eax,[a]
AB1454 push eax //&a
AB1455 push 0AB5858h //格式化
AB145A call dword ptr ds:[0AB9110h] //scanf
AB1460 add esp,8 //堆栈平衡
AB1463 cmp esi,esp
AB1465 call __RTC_CheckEsp (0AB1140h) //堆栈检查
switch (a)
AB146A mov eax,dword ptr [a]
AB146D mov dword ptr [ebp-0E4h],eax //0E4为提升堆栈空间
AB1473 mov ecx,dword ptr [ebp-0E4h] //ecx为输入值
AB1479 sub ecx,5 //ecx - 5
AB147C mov dword ptr [ebp-0E4h],ecx
AB1482 cmp dword ptr [ebp-0E4h],2Dh //ecx - 5 与 45 比较
AB1489 ja $LN10+7Dh (0AB1520h) //defalut
AB148F mov edx,dword ptr [ebp-0E4h] //edx = ecx - 5
AB1495 movzx eax,byte ptr [edx+0AB168Ch] //0AB168Ch为索引表地址, edx为索引表索引
AB149C jmp dword ptr [eax*4+0AB1674h] //0AB1674为case表的地址, eax为地址表索引
对于连续的eg:1, 2, 3, 4, 5...只需要一张地址表
对于跨度比较大的会需要一张索引表和一张地址表
索引表的大小为case中的最大值与最小值之差, 对于最大值与最小值之差不超过255时才会采取索引表,否则会造成空间浪费.
索引表中的值为case的数量
地址表的数量为实际分支的数量
{
case 5:
case 10:
printf("a = 10 || a == 5\n");
AB14A3 mov esi,esp
AB14A5 push 0AB585Ch
AB14AA call dword ptr ds:[0AB9114h]
AB14B0 add esp,4
AB14B3 cmp esi,esp
AB14B5 call __RTC_CheckEsp (0AB1140h)
break;
AB14BA jmp $LN10+94h (0AB1537h) //switch...case...end
case 20:
printf("a = 20\n");
AB14BC mov esi,esp
case 20:
printf("a = 20\n");
AB14BE push 0AB5874h
AB14C3 call dword ptr ds:[0AB9114h]
AB14C9 add esp,4
AB14CC cmp esi,esp
AB14CE call __RTC_CheckEsp (0AB1140h)
break;
AB14D3 jmp $LN10+94h (0AB1537h) //switch...case...end
case 30:
printf("a = 30\n");
AB14D5 mov esi,esp
AB14D7 push 0AB5880h
AB14DC call dword ptr ds:[0AB9114h]
AB14E2 add esp,4
AB14E5 cmp esi,esp
AB14E7 call __RTC_CheckEsp (0AB1140h)
break;
AB14EC jmp $LN10+94h (0AB1537h)
case 40:
printf("a = 40\n");
AB14EE mov esi,esp
AB14F0 push 0AB588Ch
AB14F5 call dword ptr ds:[0AB9114h]
AB14FB add esp,4
AB14FE cmp esi,esp
AB1500 call __RTC_CheckEsp (0AB1140h)
break;
AB1505 jmp $LN10+94h (0AB1537h)
case 50:
printf("a = 50\n");
AB1507 mov esi,esp
AB1509 push 0AB5898h
AB150E call dword ptr ds:[0AB9114h]
AB1514 add esp,4
AB1517 cmp esi,esp
AB1519 call __RTC_CheckEsp (0AB1140h)
break;
AB151E jmp $LN10+94h (0AB1537h)
default:
printf("unknown\n");
AB1520 mov esi,esp
AB1522 push 0AB58A4h
AB1527 call dword ptr ds:[0AB9114h]
AB152D add esp,4
AB1530 cmp esi,esp
AB1532 call __RTC_CheckEsp (0AB1140h)
swtich...case反汇编分析
最新推荐文章于 2022-09-25 12:34:19 发布