【发布时间】:2021-10-06 10:09:02
【问题描述】:
我有以下代码:
or edx,edx (0 Or 0 would equal 0)
jz InvalidDivisor
如果我把代码改成这样:
AND edx,edx (0 and 0 would equal 0)
jz InvalidDivisor
两种方法都不能用于检查产品是否为 0?
【问题讨论】:
我有以下代码:
or edx,edx (0 Or 0 would equal 0)
jz InvalidDivisor
如果我把代码改成这样:
AND edx,edx (0 and 0 would equal 0)
jz InvalidDivisor
两种方法都不能用于检查产品是否为 0?
【问题讨论】:
这两种方法都有效,但test edx, edx 的作用相同,而且比其中任何一种都更惯用。
它也可能更有效,因为我猜or 或and 对 CPU 来说似乎它们可能会修改寄存器的值,因为 or edx, XXX 通常会这样做,并且CPU 可能不会检查这种特殊情况。这可能意味着使用 edx 值的后续指令必须停止,直到 or/and 完成执行,而对于 test,这些后续指令可以继续并乱序执行,而无需等待 test 完成.
【讨论】:
test 在许多情况下效率更高,包括允许与 AMD CPU 和早期 Intel 上的 JCC 融合。有一个规范的副本:Test whether a register is zero with CMP reg,0 vs OR reg,reg?