web-dev-qa-db-ja.com

アセンブリにおけるJAとJGの違い

アセンブリ言語のJUMP IF ABOVEJUMP IF GREATERの違いを教えてください。それらのそれぞれをいつ使用しますか?彼らは私に異なる結果を与えますか?

22
user3157687

Intelのマニュアルの説明 のように、JGはフラグを比較が署名されたものとして解釈し、JAはフラグを比較が符号なしのように解釈します(もちろん、フラグを設定する操作が比較または減算ではなかった場合) 、それは意味をなさないかもしれません)。はい、それらは異なります。正確には、

  • jaは、CF = 0およびZF = 0の場合にジャンプします(上記の符号なし:キャリーなしで等しくない)
  • jgは、SF = OFおよびZF = 0の場合にジャンプします(等号を除く、より大きい符号付き)

例えば、

cmp eax, edx
ja somewhere ; will go "somewhere" if eax >u edx
             ; where >u is "unsigned greater than"

cmp eax, edx
jg somewhere ; will go "somewhere" if eax >s edx
             ; where >s is "signed greater than"

>u>sは、最上位ビットが0の値に同意しますが、最上位ビットが設定された値は、>sによって負として扱われ、>uによって大きく扱われます(もちろん両方のオペランドには、>u>sが再度同意する最上位ビットが設定されています)。

32
harold

JAは、最後の「フラグ変更」命令が符号なしの数値にあった場合のジャンプに使用されます。しかし、一方で、最後の「フラグ変更」命令が符号付き数値にあった場合、JGはジャンプに使用されます。

0
Rahimi0151