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

来源:互联网 发布:数据猿 编辑:程序博客网 时间:2024/05/21 06:27

举例代码如下

 这句代码的关键点是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运算周期


达到程序优化效果