您的位置:首页 > 其它

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

2010-07-14 14:55 260 查看
举例代码如下

_asm
{
mov ax,1
sub ax,1
neg ax         -->关键点
sbb ax,ax      -->关键点
mov bx,4
lea bx,[bx-4*ax]    //这句伪代码
}


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

达到程序优化效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: