举例代码如下
这句代码的关键点是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运算周期
达到程序优化效果