(ia32)例如,
test $eax, $eax
你为什么要这样做?它确实$eax & $eax
,对吗?不应该总是设置标志寄存器,说它们是相等的。?
附录 因此,如果寄存器为零,测试将设置ZF(如下所述)。那么测试(如上所述)主要用于判断寄存器是否为空?如果是,则设置ZF?
答案 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上练习这个!)
答案 3 :(得分:1)
此指令不仅用于检查%eax
的值是否为零。它可以作为一个整体用于检查值%eax
是零还是正或负。
以这种方式使用它的最大优点是它不会修改%eax
的值(在执行%eax & %eax
之后,它只是丢弃该值)并设置条件标志如下。
如果%eax值为零,OF, CF, ZF = 0
(设置为零)
else SF = MSB of the result
(此处,结果为%eax & %eax
)。因此,如果数字为负数,则为SF = 1
,否则为SF = 0
。