You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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 - 2
  • cmp $0x5,%rdi:判断索引是否大于5,大于就走default,说明跳转表最大索引是5,对应最大case值为 2 + 5 =7
    所以有效case的取值就是2、3、4、5、6、7,对应跳转表索引0~5。

第二步:对应跳转表条目和case值

跳转表.L4的条目是按索引从小到大排列的,直接按顺序对应即可:

跳转表索引对应case值(索引+2)跳转目标代码段
02Case C
13Case B
24x +=10 分支
35Case A
46x *=7 分支
57Case D

第三步:匹配你提到的几个对应关系

  1. Case A对应Case 5:Case A的代码逻辑是x -= 60,对应跳转表索引3,所以case值为3+2=5
  2. Case 2对应Case C:索引0对应case值2,跳转目标为Case C的代码段
  3. Case7对应Case D:索引5对应case值7,跳转目标为Case D的代码段
    其余对应关系直接查上面的表格即可。

通用推导规则:所有switch跳转表的推导都可以沿用这个逻辑,先找参数的偏移量(最小case值)、再找索引最大值(算出最大case值),最后按跳转表顺序一一对应即可。

内容的提问来源于stack exchange,提问作者Megan Darcy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:54:04