相关疑难解决方法(0)

使用CMP reg测试寄存器是否为零,0与OR reg,reg?

使用以下代码是否存在任何执行速度差异:

cmp al, 0
je done
Run Code Online (Sandbox Code Playgroud)

以下内容:

or al, al
jz done
Run Code Online (Sandbox Code Playgroud)

我知道JE和JZ指令是相同的,并且使用OR可以提供一个字节的大小改进.但是,我也关心代码速度.逻辑运算符似乎比SUB或CMP更快,但我只是想确定.这可能是规模和速度之间的权衡,或双赢(当然代码将更加不透明).

optimization x86 assembly micro-optimization

13
推荐指数
2
解决办法
3755
查看次数

"或eax,eax"和"test eax,eax"之间的区别

or eax,eax和之间有什么区别test eax,eax?我已经看到不同的编译器生成两者用于相同的比较,并且就文档而言它们做的完全相同,所以我想知道为什么它们并非全部使用test eax,eax.考虑它and eax,eax会以同样的方式设置标志,但我没有在freepascal,delphi或msVC++中看到它.

我确实在delphi中编译了一些asm块并检查了汇编源代码,并且所有3种形式在操作码中的长度完全相同,并且还检查了英特尔性能PDF并且它说它们具有相同的延迟和吞吐量.

编辑:
问题具体是关于具体案例之间的区别test eax,eax,or eax,eaxand eax,eax.对于寄存器,标志,操作码长度,延迟,吞吐量,所有3都给出完全相同的结果.然而,如果测试0,如果不是零,或者如果签名,一些编译器会在使用test eax,eax时使用or eax,eax,我想知道为什么它们并非全部使用,test eax,eax因为它使代码更加清晰.

编辑2:
作为参考,我在家里只有老版本的msvc ++和Delphi,但测试一个变量,如果为零,msvc ++就是这样test eax,eax,而Delphi则是or eax,eax.

x86 assembly micro-optimization

8
推荐指数
1
解决办法
3727
查看次数

标签 统计

assembly ×2

micro-optimization ×2

x86 ×2

optimization ×1