質問

(ia32) たとえば、

test $eax, $eax

なぜそれをしたいのですか?します $eax & $eax, 、 右?これはすべきではない いつも それらが等しいことを示すようにフラグ レジスタを設定します。

補遺:したがって、レジスタがゼロの場合、テストは ZF を設定します (後述)。では、テスト(上で使用したように)は主に、レジスタが空かどうかを確認するためにのみ使用されますか?そうであれば、ZF は設定されていますか?

役に立ちましたか?

解決

レジスタがゼロの場合、

ZF(ゼロフラグ)を設定します。つまり、最も一般的にテストするために使用されているものはおそらくです。また、適切に他のフラグを設定しますが、それらのためにはるかに少ない使用はおそらくあります。

また、私は本当に比較を実行しないことtestを言及する必要があります - 。それは(フラグを除いて、結果を捨てる)ビットごとのand動作を行います。

オペランドの比較を行うために、cmp命令はフラグを除いた結果を捨て、sub動作を行う、使用されるであろう。あなたは正しいこと

cmp $eax, $eax
フラグが毎回ゼロ結果に応じて設定されるように、

は、多くのポイントを持っていないであろう。

他のヒント

これは、同様にゼロフラグのor $eax,$eax缶の非破壊試験を用いて同じ方法をゼロフラグをセットされます。

値がゼロである場合は、「試験EAX、EAX」の後に言うことができる(または任意の他のレジスタ8、16、32及びIは64ビットを考える)に

は、プロセッサ上でZ及びSフラグを設定する場合、または符号ビットは、それぞれ "JE / JNE / JZ / JNZ" を使用して、または "JS / JNS" により、設定されています。 X80 / x86のアーキテクチャーをコードの30年間で、私は、レジスタの組み合わせのほとんどは、この何回の膨大な数をやりました。 (あなたはESPに実際にこれを使用しないでください!)

IIRCは、「JP / JNP」を使用してレジスタに設定されたビットの数が偶数か奇数であれば、あなたが言うことができるこのテストを、行うようにすることによって、あまりにも計算されていますパリティビットがあります。 Iこのため、使用していた。のことはありませんのきます。

この命令は%eaxの値がゼロである場合にのみチェックするものではありません。これは、値%eaxはゼロまたは正または負であるかどうかを確認するために使用される全体的であってもよいです。 このようにそれを使用しての最大の利点は、それが(%eax、それだけで破棄離れた値を実行した後)%eax & %eaxの谷を変更しないで、次のように条件フラグを設定します。

%のEAXの値がゼロである場合、OF, CF, ZF = 0(ゼロに設定)
SF = MSB of the result(ここでは、結果が%eax & %eaxです)。数が負であれば、我々はそうでないSF = 1SF = 0を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top