首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"or eax,eax“和"test eax,eax”之间的区别

"or eax,eax“和"test eax,eax”之间的区别
EN

Stack Overflow用户
提问于 2014-05-16 11:05:09
回答 3查看 5.2K关注 0票数 9

or eax,eaxtest eax,eax有什么不同?我见过不同的编译器进行相同的比较,就文档而言,它们做的是完全相同的事情,所以我想知道为什么它们不都使用test eax,eax。考虑到这一点,and eax,eax会以相同的方式设置标志,但我还没有在freepascal、delphi或msVC++中看到过它。

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

编辑:

这个问题具体是关于特定案例test eax,eaxor eax,eaxand eax,eax之间的区别。对于寄存器、标志、操作码长度、延迟和吞吐量,所有3个都给出了完全相同的结果。然而,为了测试0,如果不是0,或者如果是有符号的,一些编译器将使用test eax,eax,而另一些编译器使用or eax,eax,我想知道为什么他们不都使用test eax,eax,因为它使代码更清晰。

Edit2:

作为参考,我在家里,这里只有更老的msvc++和Delphi,但如果测试一个变量为0,msvc++做test eax,eax,而Delphi做or eax,eax

EN

回答 3

Stack Overflow用户

发布于 2014-05-16 13:33:20

通常,testand之间的唯一区别是test <reg>, <reg>不修改其操作数。本质上,test应用了and操作,丢弃了结果中的非标志部分。如果操作数相同,则结果将相同(or也是如此)。

由于像微操作融合这样的东西,test可能是一个更好的指令选择。因此,除非必须重复计算,否则通常首选testcmp/sub也是如此。

在英特尔的文档中搜索"fusion“,您应该可以找到详细信息。

票数 7
EN

Stack Overflow用户

发布于 2014-05-16 22:06:53

确定test eax, eax之后的eax的内容与指令之前相同的电路比为or eax, eax得出该结论所需的电路更简单。因此,test更好。

一些编译器可能在它没有任何作用的时候生成了or (在乱序执行之前),但它将在当今的一些无序处理器上产生差别(而其他OOO处理器将变得如此复杂,以至于它们会将or eax, eax识别为真正等同于test eax, eax)。

我找不到一个参考资料来证明一些现代处理器实际上能够推断出or reg, reg不会修改reg,但here is回答说xchg reg, reg是这样的。

票数 3
EN

Stack Overflow用户

发布于 2014-05-16 21:31:32

仅重申并补充一下@gsg所指出的,测试指令对两个操作数进行逐位逻辑比较(本质上是在内部逐位ANDing它们,但不存储结果),并根据该操作的结果设置处理器标志。OR指令对源和目标进行逻辑或,将结果存储在目标中,并根据结果设置处理器标志。它们都以相同的方式影响处理器标志。因此,当操作数相同时,行为是相同的。在标志上没有区别。然而,当操作数不同时,它们的行为就会完全不同。您还可以使用and eax,eax测试是否为零,这也会对标志产生相同的影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23691989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档