本例中需要掌握一定的汇编代码阅读知识,环境为 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字节边界对齐。