アセンブリ言語のJUMP IF ABOVEとJUMP IF GREATERの違いを教えてください。それらのそれぞれをいつ使用しますか?彼らは私に異なる結果を与えますか?
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
が再度同意する最上位ビットが設定されています)。
JA
は、最後の「フラグ変更」命令が符号なしの数値にあった場合のジャンプに使用されます。しかし、一方で、最後の「フラグ変更」命令が符号付き数値にあった場合、JG
はジャンプに使用されます。