C语言与汇编语言对照分析 联系客服

发布时间 : 星期六 文章C语言与汇编语言对照分析更新完毕开始阅读af336a55178884868762caaedd3383c4bb4cb406

jmp ds:off_40123C[nGameEvent*4]

其中off_40123C为跳转表地址,跳转表中每一项代表一个32位地址(4个字节),当nGameEvent为0按第一项地址跳转,当nGameEvent为1按第二项地址跳转,依次类推。 b) 分支代码

各个分支的处理逻辑都在这里,示例代码中仅仅简单的调用对应函数。 (PS:这里用jmp而不用call是编译器优化的结果) c) 跳转表

跳转表实际是一个地址数组,存放了每个跳转分支的地址(32位绝对地址),当nGameEvent为0时,跳转表达式读取数组中第一项数据(0x0040121C),即

.text:0040121C E9 8F FF FF+ jmp ?DoLogin@@YAXXZ 调用DoLogin函数。

(PS: 实际运行时,由于随机化基址,从调试器看到的跳转表内容可能与静态分析时不同,这是重定位引起的,关于重定位的原理可以参考相关文档,这里不再详述) 2. 不连续的switch...case

上面的示例中case的值是连续的,因此跳转表比较规则。在实际使用中可能会遇到不规则的case值,如下图:

汇编代码:

上面的代码有两个特点:

i. 最小case值非0

上图中最小case值为3,为了不浪费跳转表空间,编译器会将索引值减去3保证最小的case值对应跳转表中的第一项。