【16位汇编】neg+sbb算术运算代替逻辑跳转

举例代码如下

 这句代码的关键点是neg 和sbb

相关知识点

neg(求补指令)

NEG指令除了对操作数作符号取反外 会根据操作数来修改标志位CF

当操作数为0是CF修改为0  否则CF修改为1


sbb( 带借位减法指令)
SBB reg,imm/reg/mem ;reg←(reg-(imm/reg/mem)-CF)

SBB mem,imm/reg ;mem←mem-imm/reg-CF

mov ax,1    ;
sub ax,1
neg ax
sbb ax,ax
mov bx,4
lea bx,[bx-4*ax]

mov ax,1      ;ax = 1
sub ax,1      ;ax = 0
neg ax        ;ax = 0 CF = 0
sbb ax,ax     ;CF = 0 ax = 0
mov bx,4      ;bx = 4
lea bx,[bx-4*ax] ;bx = 4
最后bx = 4

mov ax,2      ;ax = 2
sub ax,1      ;ax = 2
neg ax        ;ax = 1 CF = 1
sbb ax,ax     ;CF = 1 ax = -1
mov bx,4      ;bx = 4
lea bx,[bx-4*ax] ;bx = 8
最后bx = 8

并且发现最后结果只有两种可能4或8
"模板"   一下伪代码
int  nFlag
mov ax,nFlag 
sub ax,1   
neg ax      
sbb ax,ax 
mov bx,4   
lea bx,[bx-4*ax]
这句相当于就是
if(nFlag = 1)
 bx = 4
else
 bx = 8
这样使用算术运算代替了逻辑运算 大大减少

了CPU运算周期


达到程序优化效果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值