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

时间:2010-05-10 23:37:18

标签: testing cpu-registers x86

(ia32)例如,

test $eax, $eax

你为什么要这样做?它确实$eax & $eax,对吗?不应该总是设置标志寄存器,说它们是相等的。?

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

4 个答案:

答案 0 :(得分:10)

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

另外,我应该提到test并没有真正执行比较 - 它执行按位and操作(抛弃结果,除了标志)。

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

你是对的
cmp $eax, $eax

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

答案 1 :(得分:1)

这是设置零标志,就像使用or $eax,$eax也可以非破坏性地测试零标志一样。

答案 2 :(得分:1)

它设置处理器上的Z和S标志,因此您可以在“test eax,eax”(或任何其他寄存器8,16,32和我认为64位)之后判断该值是否为零,或者如果通过分别使用“je / jne / jz / jnz”或“js / jns”设置符号位。在x80 /​​ x86架构的30年编码中,我已经做了很多次,大多数寄存器组合。 (你不会在ESP上练习这个!)

IIRC,还有一个计算的奇偶校验位,所以通过这个测试,您可以使用“jp / jnp”判断寄存器中设置的位数是偶数还是奇数。我永远不会对此有用。

答案 3 :(得分:1)

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

如果%eax值为零,OF, CF, ZF = 0(设置为零)
else SF = MSB of the result(此处,结果为%eax & %eax)。因此,如果数字为负数,则为SF = 1,否则为SF = 0