web-dev-qa-db-ja.com

cmplとcmpの違い

パズルを解くことができるようにアセンブリを理解しようとしています。しかし、私は次の指示に遭遇しました:

0x0000000000401136 <+44>:    cmpl   $0x7,0x14(%rsp)
0x000000000040113b <+49>:    ja     0x401230 <phase_3+294>

私の考えは、次のとおりです。0x14​​(%rsp)の値は-7380です。私の理解によると、cmplは符号なしと比較されます。ジャンプも行われます。 (unsigned)-7380> 7(unsigned)7380> 7-> jump

実際にジャンプしたくありません。しかし、これは正しい説明ですか?引数をめくっていますか?

また、このジャンプを操作する方法についてアドバイスがあれば!

11
Sarah cartenz

私の理解によると、cmplは符号なしと比較されます。

ある方法で両方を行います。

符号付きと符号なしの違いは、ジャンプ命令の使用法です。

ために >、符号なしの場合はja、符号付きの場合はjgがあります(上記の場合はジャンプし、それより大きい場合はジャンプします)。

ために <、符号なしの場合はjb、符号付きの場合はjlです(以下の場合はジャンプし、少ない場合はジャンプします)。

正確には、いくつかのジャンプコマンドの意味は次のとおりです。

符号なし比較の場合:

JB/JNAE (CF = 1)           : Jump if below/not above or equal
JAE/JNB (CF = 0)           : Jump if above or equal/not below
JBE/JNA (CF = 1 or ZF = 1) : Jump if below or equal/not above
JA/JNBE (CF = 0 and ZF = 0): Jump if above/not below or equal

符号付き比較の場合:

JL/JNGE (SF <> OF)          : Jump if less/not greater or equal
JGE/JNL (SF = OF)           : Jump if greater or equal/not less
JLE/JNG (ZF = 1 or SF <> OF): Jump if less or equal/not greater
JG/JNLE (ZF = 0 and SF = OF): Jump if greater/not less or equal
19
glglgl

X86には実際にCMPLという命令があるとは思いません。オペランドまたは何かにヒントを与えることは、おそらくアセンブラー構文の一部です(JZJEは同じです)。

それが何をしているかに関するインテルのマニュアルから:

最初のソースオペランドを2番目のソースオペランドと比較し、結果に応じてEFLAGSレジスタにステータスフラグを設定します。比較は、第1オペランドから第2オペランドを減算し、SUB命令と同じ方法でステータスフラグを設定することによって実行されます。即値がオペランドとして使用される場合、最初のオペランドの長さに符号拡張されます。

数値の2の補数表現のため、符号性は暗黙的に与えられます。

ジャンプを操作するには?ジャンプがそれとは正反対のことをするはずであると確信している場合は、JAJBEに変更するだけです。

1
typ1232