在没有 CMP 的情况下检查结果是否为 0?组装 x86 MASM

1 x86 assembly masm

我有以下代码:

or edx,edx          (0 Or 0 would equal 0)
jz InvalidDivisor
Run Code Online (Sandbox Code Playgroud)

如果我将代码更改为:

AND edx,edx            (0 and 0 would equal 0)
jz InvalidDivisor
Run Code Online (Sandbox Code Playgroud)

两种方法都不能用于检查产品是否为 0?

Nat*_*dge 5

这两者都有效,但test edx, edx作用相同,并且比其中任何一个都更惯用。

它也可能更有效,因为我猜想orand会在 CPU 看来好像它们可能会修改寄存器的值,因为or edx, XXX通常会这样做,并且 CPU 可能不会检查这种特殊情况。这可能意味着使用 值的后面的指令edx必须暂停直到or/and完成执行,而test那些后面的指令可以继续执行并无序执行而无需等待test完成。