Разница между JA и JG в сборке

Не могли бы вы рассказать мне разницу между JUMP IF ABOVE И JUMP IF GREATER на языке ассемблера? когда я использую каждый из них? они дают мне разные результаты?

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