Не могли бы вы рассказать мне разницу между JUMP IF ABOVE И JUMP IF GREATER на языке ассемблера? когда я использую каждый из них? они дают мне разные результаты?
Разница между JA и JG в сборке
Ответ 1
Как объясняет руководство Intel, JG интерпретирует флаги, как если бы сравнение было подписано, а JA интерпретирует флаги, как если бы сравнение было беззнаковым (конечно, если операция, которая установила флаги, не была сравнением или вычитанием, это может не иметь смысла), Так что да, они разные. Точнее,
-
ja
перескакивает, еслиCF = 0
иZF = 0
(без знака выше: нет переноса и не равно) -
jg
перескакивает, еслиSF = OF
иZF = 0
(со знаком Greater, кроме равных)
Например,
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
согласуются для значений с нулевым верхним битом, но значения с установленным верхним битом обрабатываются как >s
и как большие >u
(конечно, если для обоих операндов установлен верхний бит, >u
и >s
снова согласен).
Ответ 2
Приняты неподписанные значения, другие подписаны.
Ответ 3
JA
используется для перехода, если последняя инструкция "смена флага" была на числах без знака. но с другой стороны, JG
используется для перехода, если последняя инструкция "смена флага" была на знаковых числах.