分支优化: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;
==============================================================
计算机中数码的表示:
定义-》
正数:原码,反码,补码相同。
负数:原码为其对应正数原码最高符号位取反。
反码为其原码除符号位外都取反。
补码为其原码除符号位外取反加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算术运算代替逻辑跳相关推荐
- 浅谈neg+sbb指令
neg指令:intel指令手册是这样说明的 IF DEST = 0 THEN CF <- 0; ELSE CF <- 1 就是说,当操作数为0时,cf标志为0,否则cf被置1.(这让我们联 ...
- 机器学习-算法背后的理论与优化(part1)--从线性回归到逻辑回归
学习笔记,仅供参考,有错必纠 参考自:机器学习-算法背后的理论和优化: 从线性回归到逻辑回归 线性回归估算的是一个连续变量的条件期望: E ( y ∣ x ) = w T x (1) E(y|x)=w ...
- NEG+SBB指令组合的用处
计算机中数码的表示: 定义-> 正数:原码,反码,补码相同. 负数:原码为其对应正数原码最高符号位取反. 反码为其原码除符号位外都取反. 补码为其原码除符号位外取反加1. 所以最高位符号位都不变 ...
- 单片微机原理与接口技术——8051汇编指令系统与编程基础(3)算术运算与逻辑运算指令
算术运算与逻辑运算指令 算术运算指令都是针对8位二进制无符号数的. 影响PSW的进位Cy.辅助进位Ac.溢出OV标志. 文章目录 算术运算与逻辑运算指令 一.算术运算指令 1.加法指令 2.带进位加法 ...
- 【优化求解】基于混合蛙跳算法实现最优求解matlab源码
1 简介 2 部分代码 clc;clear all; close all m=50; %种群分组数 n=35; %t每组青蛙包含的个数 Ne=25; %组内迭代数 smax = 100; %最大步长 ...
- Django视图优化(页面显示以及页面跳转)
django的开发流程 1.创建model 2.同步表结构到数据库 3.view里面写对应函数和逻辑 ,返回数据和html 4.修改html里面的内容,该替换的替换,该循环的循环 5.配置好url m ...
- 分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑
对于一个含有m个变量的模型,如果每个变量是连续变量,每个变量的范围无论是[-5,100].[5,500].[0,1]......,都可以作为LP问题在多项式时间内求解. 现在增加一个条件,模型中有n个 ...
- 工作307:uni-富文本的实现逻辑跳转
<template><view><jinEdit placeholder="请输入内容" @editOk="editOk" upl ...
- 2022-06-18 前端周报总结 git分支优化
本周完成工作: 项目999开发: 项目1重构进度跟进; 项目2问题排查/联调: 文档总结: 每个工作项目情况如下: 一.项目999开发: 页面1:测试验收完成: 页面2:UAT验收完成: 本周与架构联 ...
最新文章
- 全球及中国航空材料行业发展动态及应用格局展望规划报告2021-2027年版
- ReflectionLabel(倒影控件)
- 粗谈LINUX下的文件系统管理
- 硬件基础 —— 二极管
- 【nosql】NoSql是什么?
- Midletinfo-探索手机javaME系统信息的实用工具
- 腾跃英语计算机学院微信公众号,英语四级报名_微信还能这么玩:Geek大学生搭建英语课堂互动系统_沪江英语...
- 傅里叶分析公式推导(最简单的傅里叶级数和傅里叶变换)
- 角色个人属性英文缩写
- 贵阳市交通大数据中心
- 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
- 创办6年未盈利,半年亏损40亿裁员25%,狂奔的滴滴怎么了?
- Attention-guided Context Feature Pyramid Network for Object Detection
- 调用微信的收货地址和我的地址功能页面。
- 反转二叉树--递归和非递归
- 新加坡国立大学招收博士生/博士后/研究助理/访问学生
- 实现自动WiFi连接
- 到店维修要注意以下三点
- buu [SWPU2019]ReverseMe1 wp
- ArcGIS 已知某点经纬度,如何制以该点为中心的10km的矢量shp文件
热门文章
- 阿里新生的面试经,与老人分享的职业进阶攻略及规划
- 动静结合学内核:linux idle进程和init进程浅析
- 【SSH项目实战】国税协同平台-26.分页功能编写
- 如何设计系统的错误码及错误信息
- sqlite 实例教程 IOS下用sqlite打造词典
- Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数
- Learn from mistake, i.e. 和 e.g. 是不同的
- 5. python Collections -- OrdereDict
- Networking 基本术语/概念
- Mozilla 宣布引入二步认证