neg+sbb指令

本文探讨了Intel指令集中的neg和sbb指令。neg指令用于求反和设置CF标志,当操作数为0时CF设为0,否则设为1。sbb指令则基于CF进行减法操作。通过neg影响CF,然后使用sbb,可以无条件分支地实现条件跳转的效果。示例代码展示了如何利用这种技巧在eax为0时将其改为5,否则改为1,以此优化‘0为假,非零为真’的条件判断语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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指令的初级作用就是对一个数来求绝对值




[plain] view plaincopy
cmp al,0  
jge xx  
neg al;al小于0就求绝对值  
xx:  
进一步,neg对cf标志的影响可以用来优化条件跳转语句。看到cf标志,会联想到sbb这个指令,


[plain] view plaincopy
sbb 目的操作数,源操作数  
sbb的作用就是用目的操作数减去源操作数,再减去cf,结果送到目的操作数
也就是说,我们可以先用neg指令来影响cf标志,接着调用sbb指令,那么这个sbb指令就会根据neg指令中操作数是否为0来决定减去0(此时cf为0),或者减去1(此时cf为1)。


看这段代码:


[plain] view plaincopy
neg eax  
sbb eax,eax  
and al,0fc;ofc是-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语句).而这段代码没有用到条件分支就实现了条件分支的作用,可以用来优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值