码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈neg+sbb指令

时间:2015-06-27 11:14:47      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

neg指令:intel指令手册是这样说明的

IF DEST = 0

THEN CF <- 0;

ELSE CF <- 1

就是说,当操作数为0时,cf标志为0,否则cf被置1.(这让我们联想到c语言中很多函数返回0和非0,然后用if来判断0或者非0走不同的分支)

neg指令的作用就是对操作数求反,neg eax :用伪代码表示就是 eax = -eax;

那么neg指令的初级作用就是对一个数来求绝对值

  1. cmp al,0  
  2. jge xx  
  3. neg al;al小于0就求绝对值  
  4. xx:  

进一步,neg对cf标志的影响可以用来优化条件跳转语句。看到cf标志,会联想到sbb这个指令,

  1. sbb 目的操作数,源操作数  

sbb的作用就是用目的操作数减去源操作数,再减去cf,结果送到目的操作数

也就是说,我们可以先用neg指令来影响cf标志,接着调用sbb指令,那么这个sbb指令就会根据neg指令中操作数是否为0来决定减去0(此时cf为0),或者减去1(此时cf为1)。

看这段代码:

  1. neg eax  
  2. sbb eax,eax  
  3. and al,0fc;ofc是-4  
  4. add eax,5  

解释:如果eax为0,neg eax之后cf=0;那么sbb eax,eax之后eax就为0,al自然也是0,那么and al,ofc之后al还是0,eax也是0,再接着add eax,5之后eax就是5

如 果eax不是0,neg eax 之后cf=1,那么sbb eax,eax之后eax就是-1,-1的二进制就是:0xFFFFFFFF,那么al就是0xFF,所以and al,0fc之后al中的值就是0fc,eax就是0xFFFFFFFC,也就是-4,那么add eax,5之后eax就是1.

综上:这段代码的作用就是当eax为0时,把eax改为5,当eax为非0时,eax改为1(这段代码可以用来优化c语言中的“0为假,非零即为真”的if语句).而这段代码没有用到条件分支就实现了条件分支的作用,可以用来优化代码。

浅谈neg+sbb指令

标签:

原文地址:http://www.cnblogs.com/xiaoCCBlog/p/4603650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!