其他
反汇编代码还原之优化方式
本文为看雪论坛优秀文章
看雪论坛作者ID:TkBinary
目录
一. 优化方式
1.1 前言
1.2 优化方式分类
1.3 常量折叠
1.4 常量传播
1.5 变量去除
1.6 归并优化
1.7 Cpu流水线优化
1.8 数学变换优化
1.9 不可达分支优化
2.0 代码外提优化
二. 去掉优化方式
三. 总结
一. 优化方式
1.1 前言
1.2 优化方式分类
优化方式分为以下几种:
常量折叠
常量传播
变量去除
归并优化
Cpu流水线优化
数学变换
不可达分支优化
代码外提优化
1.3 常量折叠
int n = 0;
int m = 1;
printf("%d",7 + 8);
printf("%d",n + 6);
printf("%d",n + m);
.text:00401000 push 0Fh
.text:00401002 push offset aD ; "%d"
.text:00401007 call _printf
.text:0040100C push 6
.text:0040100E push offset aD ; "%d"
.text:00401013 call _printf
.text:00401018 push 1
.text:0040101A push offset aD ; "%d"
.text:0040101F call _printf
.text:00401024 add esp, 18h
.text:00401040 sub_401040 proc near ; CODE XREF: start-8D↓p
.text:00401040 push 0Fh
.text:00401042 push offset unk_417A8C
.text:00401047 call sub_401010
.text:0040104C push 6
.text:0040104E push offset unk_417A8C
.text:00401053 call sub_401010
.text:00401058 push 1
.text:0040105A push offset unk_417A8C
.text:0040105F call sub_401010
.text:00401064 add esp, 18h
.text:00401067 xor eax, eax
.text:00401069 retn
.text:00401069 sub_401040 endp
1.4 常量传播
int n = 0;
printf("%d",n + 6);
int n = 0;
printf("%d",0 + 6);
int n = 0;
printf("%d",6);
.text:0040100C push 6
.text:0040100E push offset aD ; "%d"
.text:00401013 call _printf
1.5 变量去除
int n = 0;
int m = 1;
printf("%d",n + m);
printf("%d",0 + 1);
printf("%d",1);
.text:00401018 push 1
.text:0040101A push offset aD ; "%d"
.text:0040101F call _printf
1.6 归并优化
.text:00401018 push 1
.text:0040101A push offset aD ; "%d"
.text:0040101F call _printf
add esp,8
.text:00401040 sub_401040 proc near ; CODE XREF: start-8D↓p
.text:00401040 push 0Fh
.text:00401042 push offset unk_417A8C
.text:00401047 call sub_401010
.text:0040104C push 6
.text:0040104E push offset unk_417A8C
.text:00401053 call sub_401010
.text:00401058 push 1
.text:0040105A push offset unk_417A8C
.text:0040105F call sub_401010
.text:00401064 add esp, 18h
.text:00401067 xor eax, eax
.text:00401069 retn
.text:00401069 sub_401040 endp
1.7 Cpu流水线优化
xor eax,eax
xor ebx,ebx
xor ecx,ecx
mov eax,1
add eax,2
mov ebx,eax
mov ecx,3
xor eax,eax
mov eax,1
xor ecx,ecx
add eax,2
mov ecx,3
xor ebx,ebx
mov ebx,eax
mov eax,1
xor ecx,ecx
mov eax,1
add eax,2
xor eax,eax
mov eax,1
xor ecx,ecx
add eax,2
mov ecx,3
xor ebx,ebx
mov ebx,eax
xor ecx,ecx
mov ecx,3
xor eax,eax
mov eax,1
add eax,2
xor ebx,ebx
mov ebx,eax
1.8 数学变换优化
i = 10;
b = 11;
i = b + 0;
i = b - 0;
i = b *3;
i = b/3;
i = b;
1.9 不可达分支优化
a = 10;
if (a == 10)
{
xxxx
}
else
{
xxxxx
}
2.0 代码外提优化
int x = xxx;
while(x > y/3)
{
xxx....
x--;
}
t = y / 3;
while(x > t)
{
xxxxx....
x--;
}
二. 去掉优化方式
int n = 10;
int m = 0;
scanf("%d",&n);
scanf("%d",&m);
int c = n + m;
scanf("%d",&c);
printf("%d%d%d",&n,&m,&c)
三. 总结
上面的几种优化方式,虽然很简单,但是我们也必须要掌握以及了解的。因为后面的反汇编代码还原会有更多的优化。而那些优化在配合上面所说的优化就会让你感觉很难,或者不知道汇编为什么那样做。而你了解了这些在单独看各自的优化就会明白,也会豁然开朗。
看雪ID:TkBinary
https://bbs.pediy.com/user-home-723188.htm
*本文由看雪论坛 TkBinary 原创,转载请注明来自看雪社区。
本文参与了#看雪30天发帖打卡挑战#活动。
发帖见证成长,坚持见证不凡。
不仅可以收获进步,还可赢取物质奖励哦!
想要了解更多活动详情,戳 ↓
推荐文章++++
* Java序列化反序列化源码---Jackson反序列化漏洞源码分析
求分享
求点赞
求在看