7

我听说 x86 比较指令:cmp x, y进行减法并根据结果设置各种标志。

现在,如果我只想测试两个操作数是否相等怎么办?做异或而不是减法不会快得多吗?我的问题是,是否有一条指令可以与 XOR 进行比较以判断两个操作数是否相等?也许它看起来像这样:cmpeq x, ycmpxor x, y.

我猜如果我只是想测试是否相等,使用 acmpxor会比做cmp减法的 快。有没有这样的指令cmpxor可以让我加快速度?

我还想说,我知道这xor将设置zero flag. 但如果我这样做xor x, y,它就会改变x。我不想要那个。我想要一个比较指令,它将单独留下两个操作数。

4

1 回答 1

13

XOR、SUB、CMP、TEST 等基本机器操作都非常简单,因此它们都运行得非常快。它们还设置相同的条件代码位。从比较相等的角度来看,这些都以相同的方式设置 Z 位;其他位设置不同,因为这些操作计算不同的结果。

对于 x86 CPU,它们的执行时间没有差异,因为它们都使用相同的芯片路径。因此,您可以在计算您想要的答案时使用它们中的任何一个而不会造成性能损失。(从技术上讲,SUB 应该比 XOR 花费更长的时间,因为进位必须“涟漪”通过所有位,而 XOR 是逐位并行的。CPU 设计人员已经找到了构建极快进位计算逻辑的方法,因此有效时差并不显着。他们有很大的动机这样做,因为计算机所做的大部分工作都是“添加”])。

作为一种风格约定,如果您认为您正在“比较两个(机器字大小的)值”,您可能应该使用 CMP 指令,因为这会将您的想法传达给代码的读者。它的优点是它不会破坏其中一个操作数,一旦您编写了足够的代码,您最终会发现使用它而不是 XOR 是一个非常有说服力的论据。(TEST 有这个很好的属性,对于检查位也很有用)。

还有其他 x86 指令更好的其他类型值的比较:浮动比较、字符串比较、向量寄存器比较等。这些指令与基本操作相比花费不同的时间,因为它们必须执行更复杂的事情(例如比较多个数据字)。

于 2013-05-07T13:26:02.800 回答