【16位汇编】neg+sbb算术运算代替逻辑跳转
2010-07-14 14:55
260 查看
举例代码如下
这句代码的关键点是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运算周期
达到程序优化效果
_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运算周期
达到程序优化效果
相关文章推荐
- 分支优化:neg+sbb算术运算代替逻辑跳
- 算术移位与逻辑移位有什么区别? 其他开发语言 / 汇编语言 - CSDN社区 community.csdn.net
- 如何只用逻辑运算实现算术加减乘除运算
- Win32 汇编 - 逻辑运算指令: AND、OR、XOR、NOT、TEST
- 汇编知识点-数据传送,寻址和算术运算
- 学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
- shell编程之条件测试表达,命令间的逻辑关系式和控制结构的使用以及算术运算
- 基于ARM9的汇编指令:数据传送指令,算术运算指令,比较指令和跳转指令
- 小谈16位汇编NEG求补指令
- 编写程序,以菜单的形式完成算术运算和逻辑运算。制作小小计算器
- 运行窗体跳转时提示未处理System.OverflowException HResult=-2146233066 Message=算术运算导致溢出。 Source=DevExpress.U
- dos定义变量算术运算逻辑运算表达式分隔符
- 80386 算术运算指令,逻辑运算指令,移位指令 (三)
- 32位汇编语言学习笔记(3)--leal和算术运算指令
- 算术与逻辑运算指令具体解释
- 5.c语言逻辑运算与算术运算
- MASM汇编语言笔记(三)数据传送和算术运算
- C编译器剖析_6.3.2 汇编代码生成_为算术运算产生汇编代码
- 初学 Delphi 嵌入汇编[17] - 逻辑运算
- 汇编alpha运算处理 16位/64位