1. ホーム
  2. assembly

[解決済み] cmplとcmpの違いについて

2022-01-25 03:47:55

質問事項

パズルを解くために、アセンブリを理解しようとしています。しかし、次のような指示がありました。

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

何をやっているかというと の値は 0x14(%rsp) は-7380です。私の理解では cmpl は符号なしを比較します。また、ジャンプも実行されます。

ということは、もしかして (unsigned)-7380 > 7 --ジャンプ

実は、ジャンプしてほしくないのです。しかし、これは正しい説明なのか、そうでないのか。私は議論をひっくり返しているのでしょうか?

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

どのように解決するのですか?

<ブロッククオート

私の理解では 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