首页 > 其他 > 详细

分支优化:neg+sbb算术运算代替逻辑跳转

时间:2014-02-27 23:06:07      阅读:427      评论:0      收藏:0      [点我收藏+]

今天在分析一个样本的时候,发现一段代码。

1 // .text:100012DF                 sub     esi, 0B7h  // 183
2 // .text:100012E5                 neg     esi
3 // .text:100012E7                 sbb     esi, esi
4 // .text:100012EA                 inc     esi

neg指令影响的标志

如果源操作数是 0,则 CF 标志清除为 0;否则设置为 1。OF、SF、ZF、AF 及 CF 标志根据结果设置。

neg求补指令:相当于按各位取反加1

现在代入三种值来进行验证:

1、esi 等于 183。则有:

    sub esi, 0b7h;  esi == 0;  cf == 0;

    neg  esi;          esi == 0; cf == 0;

    sbb  esi, esi;    esi == 0; cf == 0;

    inc esi;            esi == 1;

最终结果为:1

2、esi 小于 183。则有:

    sub esi, 0b7h;  esi == 负数;  cf == 1;

    neg  esi;          esi == 正数;  cf == 1; 

    sbb  esi, esi;    esi == -1;    cf == 1;  sbb指令带cf(进位、借位)减法.多减去一个1.则为-1

    inc esi;            esi == 0;      cf == 1; 

最终结果为:0

3、esi 大于 183。则有:

    sub esi, 0b7h;  esi == 正数;  cf == 0;

    neg  esi;          esi == 负数;  cf == 1; 

    sbb  esi, esi;    esi == -1;    cf == 1;  sbb指令带cf(进位、借位)减法.多减去一个1.则为-1

    inc esi;            esi == 0;      cf == 1; 

最终结果为:0

那么遇到以上代码。则为vc编译器在02中,对逻辑跳转进行的优化。

直接还原为:

if (esi == 183)

{

   return true;

}

return false;

百度到一篇文章。作者也和我遇到同样的问题。非常感谢原作者分享经验。

链接如下:http://blog.csdn.net/cmdhack/article/details/5734395

分支优化:neg+sbb算术运算代替逻辑跳转,布布扣,bubuko.com

分支优化:neg+sbb算术运算代替逻辑跳转

原文:http://www.cnblogs.com/ziolo/p/3570564.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!