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

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;

==============================================================

计算机中数码的表示:

定义-》

正数:原码,反码,补码相同。

负数:原码为其对应正数原码最高符号位取反。

   反码为其原码除符号位外都取反。

   补码为其原码除符号位外取反加1。

所以最高位符号位都不变。

补码机:正数补码为其原码,负数为其正数原码取反加1。

NEG指令,相当于0-OPR,并影响进位标志CF.

数学意义上相当于:相当于0-OPR

在计算时实际是以补码形式运算,运算时只有0不影响CF,其它情况都影响CF.为什么,请看以下分析:

(1)假设有数:a=3;

那么:NEG a

分析:a补码为0011,0的补码为0000,所以0000-0011最终会向高位借1所以会有CF=1

(2)假设有数:a=-3;

那么:NEG a

分析:a为负数,补码为1101,所以0000-1101=0011即正数3,所以CF=1

NEG+SBB指令

假设有C语言:
  if(foo() != 0)
  {
    return(FALSE);
  }else{
    return(TURE);
  }
也可以是:
  if(foo() != 0) return(FALSE);
  return TURE;

可以这样汇编(用fasm语法):

  call [foo];调用foo(),返回值在eax中
  neg eax;把操作数按位求反后末位加1, 且if(EAX==0){CF=0}else{CF=1}
  sbb eax,eax; eax-eax-cf ==> (eax)
        ;操作结果:如果foo的返回值不是 0,此时 (eax) = -1
        ;    :如果foo的返回值是 0,此时 (eax) = 0
  inc eax  ; 操作结果:如果foo的返回值不是 0,此时 (eax) = 0
        ;    :如果foo的返回值是 0,此时 (eax) = 1

进一步解释
; if (EAX)=0 则:
; NEG EAX ;等价于: 0 - (EAX) = 0 , 结果: (EAX)=0 ,CF=0
; SBB EAX, EAX ; 等价于 (EAX)-(EAX)-(CF) , 结果为: (EAX)=0
; INC EAX ; ,结果 (EAX)=1

;if EAX!=0 (假设 EAX=5) 则:
; NEG EAX 等价于: 0 - 5 = -5 所以: (EAX)= -5 ,但CF=1
; SBB EAX, EAX 等价于 (EAX)-(EAX)-(CF) 即: (EAX)= -1
; INC EAX 结果 (EAX)=0

分支优化:neg+sbb算术运算代替逻辑跳相关推荐

  1. 浅谈neg+sbb指令

    neg指令:intel指令手册是这样说明的 IF DEST = 0 THEN CF <- 0; ELSE CF <- 1 就是说,当操作数为0时,cf标志为0,否则cf被置1.(这让我们联 ...

  2. 机器学习-算法背后的理论与优化(part1)--从线性回归到逻辑回归

    学习笔记,仅供参考,有错必纠 参考自:机器学习-算法背后的理论和优化: 从线性回归到逻辑回归 线性回归估算的是一个连续变量的条件期望: E ( y ∣ x ) = w T x (1) E(y|x)=w ...

  3. NEG+SBB指令组合的用处

    计算机中数码的表示: 定义-> 正数:原码,反码,补码相同. 负数:原码为其对应正数原码最高符号位取反. 反码为其原码除符号位外都取反. 补码为其原码除符号位外取反加1. 所以最高位符号位都不变 ...

  4. 单片微机原理与接口技术——8051汇编指令系统与编程基础(3)算术运算与逻辑运算指令

    算术运算与逻辑运算指令 算术运算指令都是针对8位二进制无符号数的. 影响PSW的进位Cy.辅助进位Ac.溢出OV标志. 文章目录 算术运算与逻辑运算指令 一.算术运算指令 1.加法指令 2.带进位加法 ...

  5. 【优化求解】基于混合蛙跳算法实现最优求解matlab源码

    1 简介 2 部分代码 clc;clear all; close all m=50; %种群分组数 n=35; %t每组青蛙包含的个数 Ne=25; %组内迭代数 smax = 100; %最大步长 ...

  6. Django视图优化(页面显示以及页面跳转)

    django的开发流程 1.创建model 2.同步表结构到数据库 3.view里面写对应函数和逻辑 ,返回数据和html 4.修改html里面的内容,该替换的替换,该循环的循环 5.配置好url m ...

  7. 分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑

    对于一个含有m个变量的模型,如果每个变量是连续变量,每个变量的范围无论是[-5,100].[5,500].[0,1]......,都可以作为LP问题在多项式时间内求解. 现在增加一个条件,模型中有n个 ...

  8. 工作307:uni-富文本的实现逻辑跳转

    <template><view><jinEdit placeholder="请输入内容" @editOk="editOk" upl ...

  9. 2022-06-18 前端周报总结 git分支优化

    本周完成工作: 项目999开发: 项目1重构进度跟进; 项目2问题排查/联调: 文档总结: 每个工作项目情况如下: 一.项目999开发: 页面1:测试验收完成: 页面2:UAT验收完成: 本周与架构联 ...

最新文章

  1. 全球及中国航空材料行业发展动态及应用格局展望规划报告2021-2027年版
  2. ReflectionLabel(倒影控件)
  3. 粗谈LINUX下的文件系统管理
  4. 硬件基础 —— 二极管
  5. 【nosql】NoSql是什么?
  6. Midletinfo-探索手机javaME系统信息的实用工具
  7. 腾跃英语计算机学院微信公众号,英语四级报名_微信还能这么玩:Geek大学生搭建英语课堂互动系统_沪江英语...
  8. 傅里叶分析公式推导(最简单的傅里叶级数和傅里叶变换)
  9. 角色个人属性英文缩写
  10. 贵阳市交通大数据中心
  11. 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
  12. 创办6年未盈利,半年亏损40亿裁员25%,狂奔的滴滴怎么了?
  13. Attention-guided Context Feature Pyramid Network for Object Detection
  14. 调用微信的收货地址和我的地址功能页面。
  15. 反转二叉树--递归和非递归
  16. 新加坡国立大学招收博士生/博士后/研究助理/访问学生
  17. 实现自动WiFi连接
  18. 到店维修要注意以下三点
  19. buu [SWPU2019]ReverseMe1 wp
  20. ArcGIS 已知某点经纬度,如何制以该点为中心的10km的矢量shp文件

热门文章

  1. 阿里新生的面试经,与老人分享的职业进阶攻略及规划
  2. 动静结合学内核:linux idle进程和init进程浅析
  3. 【SSH项目实战】国税协同平台-26.分页功能编写
  4. 如何设计系统的错误码及错误信息
  5. sqlite 实例教程 IOS下用sqlite打造词典
  6. Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数
  7. Learn from mistake, i.e. 和 e.g. 是不同的
  8. 5. python Collections -- OrdereDict
  9. Networking 基本术语/概念
  10. Mozilla 宣布引入二步认证