switch语句的工作原理

提出问题:
  • 为什么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            
分析汇编:

具体值代入法:

  1. flag = 1, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1110h
  2. flag = 2, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1114h
  3. flag = 3, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1118h
  4. flag = 4, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C111ch
  5. flag = 5, flag = flag - 1 flag<=4, 执行ja指令,地址:004547E8h
发现规律:switch语句的本质是把case的每一个地址存储在一个数组里,然后flag经过计算得出存储该地址的数组下标。
应用场景

内存里的某个整型变量根据不同的要执行不同的指令

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值