题
(IA32)例如
test $eax, $eax
为什么你想这样做呢?它$eax & $eax
,对不对?不应该这样的总是设置标志寄存器中说,他们是平等的......?
<强>附录强> 因此测试将设置ZF(如下所述),如果寄存器为零。所以是测试(如上使用的)主要只是用来判断一个寄存器为空?和ZF设定若然?
解决方案
有将设置ZF
(零标志)如果寄存器为零。这可能就是它的最常用的测试。它也将适当地设置其他标志,但可能有远不如使用这些。
此外,我应该指出,test
并没有真正执行比较 - 它执行按位and
操作(扔掉的结果,除了标志)
要执行的操作数的比较,cmp
指令将被使用,其执行一个sub
操作,扔掉除了标志的结果。你是正确的,一个
cmp $eax, $eax
不会有多大点,作为标志将根据每次一个零结果来设定。
其他提示
这是设置零标志,以同样的方式,使用or $eax,$eax
可以非破坏性测试的零标志以及
它设置在所述处理器上在Z和S标志,所以可以“测试EAX,EAX”之后告诉(或任何其他寄存器8,16,32和我认为64位)如果该值是零,或者如果符号位被置位,通过使用 “JE / JNE / JZ / JNZ” 或分别为 “JS / JNS”。 30年来编码X80 / x86体系结构的,我这个做的次数数量庞大,大部分寄存器组合。 (你不会在ESP实践使用此功能!)
IIRC,有是一个的计算过一个奇偶校验位,所以通过做这个测试,你可以告诉我们,如果在寄存器中设置的位数为偶数或奇数,使用“JP / JNP”。我一直的从不的有一个用于此。
此指令不意味着只检查是否%eax
的值是零。它可以是作为一个整体用来检查值%eax
是零或正或负。
使用这种方式的最大优点是它不会修改%eax
淡水河谷(执行%eax & %eax
,它只是丢弃掉的值之后),并设置条件标志如下。
如果%eax中值是零,OF, CF, ZF = 0
(设置为零),点击
其他SF = MSB of the result
(这里,结果是%eax & %eax
)。因此,如果数字为负,我们得到SF = 1
,否则SF = 0
。