SPARC アセンブリには、cmp
2 つの数値を比較する命令があります (私の理解が正しければ、減算を使用します)。subcc
、addcc
、 、 などもandcc
あります。cmp
計算の実行後に条件コードを使用して設定する場合と、2 つの数値を比較する場合の違いは何ですか? コンセプトを理解するのに苦労しています。
1 に答える
cmpを使用して2つの数値を比較することと、計算を実行した後に条件コードを設定することの違いは何ですか?
一般に(たとえば、x86または68000タイプのプロセッサの場合)、cmp
オペランドを変更したり、結果をどこにも保存したりせずに、ステータスフラグのみを設定します。
sub
なども宛先オペランドを変更しています(結果をどこかに格納する必要があります)。これは、比較操作を行う場合には必要ありません。
本質的にcmp
はsub
、結果が単純に破棄される操作です(おそらく命令サイクルを節約します)。比較を行うときは、結果は必要ありません。結果がゼロかどうか、および結果が負かどうかを知るだけで済みます。
特にSPARCでは、読みcmp
やすさを向上させるために提供される「合成命令」であり、最終的にはアセンブラによってsubcc
命令に変換されます。http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/sparc.htmlの「合成手順」を参照してください。
したがって、アセンブラによってにcmp %reg1,%reg2
変換されます。subcc %reg1,%reg2,%g0
これにより、2つのレジスタが減算され、結果がレジスタに格納されるため、結果が事実上破棄され%g0
ます。%g0
は、読み取り時に常に戻り、書き込み0
時に変更されないレジスタです。したがって、命令レベルでは、との間にまったく違いはありcmp
ませsubcc
ん(つまり、SPARCには個別のcmp
命令はありませんが、subcc
比較のために特別な宛先レジスタで使用されます)。