Не могли бы вы рассказать мне разницу между 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 используется для перехода, если последняя инструкция "смена флага" была на знаковых числах.