zoukankan      html  css  js  c++  java
  • 分支优化:neg+sbb算术运算代替逻辑跳转

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

    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

  • 相关阅读:
    为什么写技术博客对新人如此重要?
    Javascript经典正则表达式
    关于读书的那些事,其实我一直...没有行动
    dede织梦CMS文件夹目录结构
    jQ初体验,^_^
    vi/vim 基本使用方法
    (X)HTML Strict 下的嵌套规则
    KISS保持简单:纪念丹尼斯·里奇
    关于jQuery性能优化
    编码规范CSSHTML 摘自kissyui
  • 原文地址:https://www.cnblogs.com/ziolo/p/3570564.html
Copyright © 2011-2022 走看看