swtich...case反汇编分析

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)   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值