パズルを解くことができるようにアセンブリを理解しようとしています。しかし、私は次の指示に遭遇しました:
0x0000000000401136 <+44>: cmpl $0x7,0x14(%rsp)
0x000000000040113b <+49>: ja 0x401230 <phase_3+294>
私の考えは、次のとおりです。0x14(%rsp)の値は-7380です。私の理解によると、cmplは符号なしと比較されます。ジャンプも行われます。 (unsigned)-7380> 7(unsigned)7380> 7-> jump
実際にジャンプしたくありません。しかし、これは正しい説明ですか?引数をめくっていますか?
また、このジャンプを操作する方法についてアドバイスがあれば!
私の理解によると、
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
X86には実際にCMPL
という命令があるとは思いません。オペランドまたは何かにヒントを与えることは、おそらくアセンブラー構文の一部です(JZ
とJE
は同じです)。
それが何をしているかに関するインテルのマニュアルから:
最初のソースオペランドを2番目のソースオペランドと比較し、結果に応じてEFLAGSレジスタにステータスフラグを設定します。比較は、第1オペランドから第2オペランドを減算し、SUB命令と同じ方法でステータスフラグを設定することによって実行されます。即値がオペランドとして使用される場合、最初のオペランドの長さに符号拡張されます。
数値の2の補数表現のため、符号性は暗黙的に与えられます。
ジャンプを操作するには?ジャンプがそれとは正反対のことをするはずであると確信している場合は、JA
をJBE
に変更するだけです。