switch 选择结构的机器级探究(C语言)

本例中需要掌握一定的汇编代码阅读知识,环境为 I-32

在这里插入图片描述
上图中对于一个简单的 C(此例中由于 C 只支持对于数字的比较,对于某些其他高级语言 例如 javascript 可以对字符进行比较。其具体对汇编代码略有不同) 的 switch 语句进行汇编指令探究。由上述图可知道几点有趣的事情。

switch 对于待判断数的上下限确认方式

subl $10, %eax // 作用相当于 将待判断数 int a  = a - 10 即确定范围下限为 10
//	此处精妙的是进行的为 无符号的比较,即如果 a < 10 即为超过下限 则最高位为 1。
//	进行无符号比较时同样符合条件	> 7 即大于上限 17 
cmpl $7, %eax  // 作用为条件判断 if(a - 10)  > 7  即确定上限为 17 
ja .L5	// 直接跳转到 跳转表中的 .L5 

对于待判断的 case 生成跳转表

jmp *.L8(, %eax, 4)
// 上图中显示的表中可知 其为在范围内数字 即 [10, 11, 12, ... 17] 的每一种可能生成一张地址表地址表,
通过地址表后续可跳转进行具体的操作。其中此地址表在目标文件的只读节中,按照4字节边界对齐。
由上述可知 switch 通过跳转表实现条件判断,且具体实现细节类似于 if else。如果范围冗余很大,例如 [-123123 ~ 3123123] 则会导致生成的跳转表很大。所以当冗余大时,且数据密度不大时,推荐使用 If else
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值