switch语句反汇编分析

假设switch语句的分支比较少的时候(例如3,少于4的时候没有意义)没有必要使用此结构,相当于if(可观察反汇编得出此结论)。
1、各个分支常量的差值较大的时候,编译器会在效率还是内存进行取舍,这个时候编译器还是会编译成类似于if,else的结构。
2、在分支比较多的时候:在编译的时候会生成一个大表(跳转表每个地址四个字节)且各个分支常量的差值较小(或者连续)的时候,保存各个分支执行的代码首地址。
3、当差值较大的时候且(最大值和最小值)差值于256时,编译器会生成一个小表(跳转表每个字节保存的是相对于首地址低偏移量)。
查找方式:
在传入参数的时候,系统会利用参数计算出一个地址,直接调转到执行部分。
在分支常量表达式为不连续的值时,编译器会编译成类似搜索二叉树的结构。
多分支的switch反汇编结果:

temp:x-1 temp和3作比较,若temp大于3,则跳转到default分支。
不跳,则:edx=temp
下一步的跳转地址的地址:edx*4+0AA53BCh

0AA533E mov eax,dword ptr [x]
00AA5341 mov dword ptr [ebp-0C4h],eax
00AA5347 mov ecx, dword ptr [ebp-0C4h] temp
00AA534D sub ecx,1
00AA5350 mov dword ptr [ebp-0C4h],ecx
00AA5356 cmp dword ptr [ebp-0C4h],3
00AA535D ja $LN7+0Dh (0AA53A6h) E
00AA535F mov edx,dword ptr [ebp-0C4h]
00AA5365 jmp dword ptr [edx*4+0AA53BCh]

00AA536C push offset string "1" (0AA7B30h)
00AA5371 call _printf (0AA1401h)
00AA5376 add esp,4
00AA5379 jmp $LN7+0Dh (0AA53A6h)

00AA537B push offset string "2" (0AA7B34h)
00AA5380 call _printf (0AA1401h)
00AA5385 add esp,4
00AA5388 jmp $LN7+0Dh (0AA53A6h)

00AA538A push offset string "3" (0AA7B38h)
00AA538F call _printf (0AA1401h)
00AA5394 add esp,4
00AA5397 jmp $LN7+0Dh (0AA53A6h)

00AA5399 push offset string "4" (0AA7B3Ch)
00AA539E call _printf (0AA1401h)
00AA53A3 add esp,4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值