(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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top