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/62 result = 8x; return result; } 5aa { // 63 result = x / 8; // 两步合并一步 return result; } 5b2 { // 64 result = 15x; // 三步合并一步 16x - x x = result; } 5bf { // 65 x *= x; } 5c3 { // default result = 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;