Testing 在ia32中测试寄存器是否等于自身

Testing 在ia32中测试寄存器是否等于自身,testing,cpu-registers,x86,Testing,Cpu Registers,X86,(ia32)例如 test $eax, $eax 你为什么要这么做?它是$eax&$eax,对吗?这不应该总是设置标志寄存器来表示它们相等吗 附录: 因此,如果寄存器为零,测试将设置ZF(如下所述)。那个么,测试(如上所述)是否主要用于判断寄存器是否为空?如果是,则设置ZF?如果寄存器为零,则将设置ZF(零标志)。这可能是最常用的测试方法。它还将适当地设置其他标志,但这些标志的用处可能要小得多 另外,我应该提到,test实际上并不执行比较-它执行按位和操作(丢弃结果,除了标志) 要执行操作数的

(ia32)例如

test $eax, $eax
你为什么要这么做?它是
$eax&$eax
,对吗?这不应该总是设置标志寄存器来表示它们相等吗

附录: 因此,如果寄存器为零,测试将设置ZF(如下所述)。那个么,测试(如上所述)是否主要用于判断寄存器是否为空?如果是,则设置ZF?

如果寄存器为零,则将设置
ZF
(零标志)。这可能是最常用的测试方法。它还将适当地设置其他标志,但这些标志的用处可能要小得多

另外,我应该提到,
test
实际上并不执行比较-它执行按位
操作(丢弃结果,除了标志)

要执行操作数的比较,将使用
cmp
指令,该指令执行
sub
操作,丢弃除标志外的结果。你说得对

cmp $eax, $eax

没有太多意义,因为每次都会根据零结果设置标志。

这是设置零标志,与使用
或$eax相同,$eax
也可以对零标志进行非破坏性测试。

它在处理器上设置Z和S标志,因此您可以在“测试eax,eax”之后进行判断(或任何其他寄存器8、16、32,我认为是64位)如果值为零,或者如果设置了符号位,则分别使用“je/jne/jz/jnz”或“js/jns”。在为x80/x86体系结构编写代码的30年中,我已经用大多数寄存器组合多次这样做了。(在ESP上实际上没有使用此选项!)


IIRC,还有一个奇偶校验位是经过计算的,所以通过这个测试,你可以用“jp/jnp”来判断寄存器中设置的位数是偶数还是奇数。我从来没有使用过它。

此指令并非仅用于检查
%eax
的值是否为零。它可以作为一个整体用于检查
%eax
的值是否为零或正或负。 以这种方式使用它的最大优点是它不会修改
%eax
的值(在执行
%eax&%eax
之后,它只会丢弃该值),并按如下方式设置条件标志

如果%eax值为零,
OF,CF,ZF=0
(设置为零)

else
SF=MSB的结果
(这里,结果是
%eax&%eax
)。因此,如果这个数字是负数,我们得到
SF=1
,否则
SF=0

,那么上面的结果与“jne”一起使用。“jne”是否看ZF?是-jne(跳跃不相等)正在有条件地检查零标志是否有跳转。是-
jne
将在未设置
ZF
时跳转(
jne
相当于
jnz
,因为它们是相同的操作码)。可能重复