如何从switch语句推导跳转表对应的case编号(CSAPP例题疑问)
CSAPP 跳转表case对应关系推导逻辑
我们以你给出的switch示例为例,分3步就能推导出所有case的对应关系:
第一步:确定case的取值范围
看汇编代码的开头两行对switch参数n(存放在%rdi寄存器)的操作:
sub $0x2,%rdi cmp $0x5,%rdi ja .L2 # 大于则跳转到default分支
sub $0x2,%rdi:是把n减去最小case值得到跳转表索引,说明所有case里的最小值是2,计算规则为索引 = n - 2cmp $0x5,%rdi:判断索引是否大于5,大于就走default,说明跳转表最大索引是5,对应最大case值为2 + 5 =7
所以有效case的取值就是2、3、4、5、6、7,对应跳转表索引0~5。
第二步:对应跳转表条目和case值
跳转表.L4的条目是按索引从小到大排列的,直接按顺序对应即可:
| 跳转表索引 | 对应case值(索引+2) | 跳转目标代码段 |
|---|---|---|
| 0 | 2 | Case C |
| 1 | 3 | Case B |
| 2 | 4 | x +=10 分支 |
| 3 | 5 | Case A |
| 4 | 6 | x *=7 分支 |
| 5 | 7 | Case D |
第三步:匹配你提到的几个对应关系
- Case A对应Case 5:Case A的代码逻辑是
x -= 60,对应跳转表索引3,所以case值为3+2=5 - Case 2对应Case C:索引0对应case值2,跳转目标为Case C的代码段
- Case7对应Case D:索引5对应case值7,跳转目标为Case D的代码段
其余对应关系直接查上面的表格即可。
通用推导规则:所有switch跳转表的推导都可以沿用这个逻辑,先找参数的偏移量(最小case值)、再找索引最大值(算出最大case值),最后按跳转表顺序一一对应即可。
内容的提问来源于stack exchange,提问作者Megan Darcy
相关产品推荐
相关产品推荐

