1. 题目描述
二、分析求解
-
明确寄存器与变量:
rdi: x rsi: n rax: result
-
明确case个数:
x = x - 0x3c = x -60
// 60 是第一个case
cmp x - 60 - 5 = x -65
// 65 是最后一个case
ja4005c3
// x > 65 跳转到此处 猜测是default语句
-
明确每个case对应的代码块:
间接调转表有6个地址印证2中case范围60-65
并写出对应关系
60->5a1
61->5c3
62->5a1
63->5aa
64->5b2
65->5bf
default->5c3
去重化简:60/62->5a1
63->5aa
64->5b2
65->5bf
default->5c3
// 合并60 62 消去61合并到default -
对照反汇编写每个case的C代码:
5a1 { // 60/62result = 8x;return result; }5aa { // 63result = x / 8; // 两步合并一步return result;}5b2 { // 64result = 15x; // 三步合并一步 16x - xx = result; }5bf { // 65x *= x; }5c3 { // defaultresult = x + 75; return result;}
注意:
每个块在下一个块开始处结束不要重复叠加
-
整合化简C代码:
用case常量替换对应地址标号
switch(n) {
case 60:case 62:result = 8x;return result; case 63:result = x / 8; return result;case 64:result = 15x; x = result; case 65:x *= x;default:result = x + 75; return result;}return result;
消除重复 return 语句用 break 替换
最终化简结果为:
switch(n) {
case 60:case 62:result = 8x;// return result; break;case 63:result = x / 8; //return result;break;case 64:result = 15x; x = result; case 65:x *= x;default:result = x + 75; // return result;}return result;
参考链接