Пример инструкции JLE сборки JLE - PullRequest
12 голосов
/ 29 декабря 2010

Как вы используете семейство прыжков инструкций?

Вот что у них есть:

Лейбл JL
«Это» скачет, если оно меньше или если оно не больше или равно.

У меня вопрос , что это в этом предложении? Скажем, у меня есть переменная в ebx, и я хочу перейти к метке there:, если ebx равно <= 10.

В частности, меня интересует использование семейства инструкций x86 jump

Ответы [ 4 ]

13 голосов
/ 29 декабря 2010

Сам прыжок проверяет флаги в регистре EFL. Они обычно устанавливаются с помощью TEST или CMP (или как побочный эффект многих других инструкций).

CMP ebx,10
JLE there
  • CMP соответствует вычислению разности операндов, обновлению флагов и отбрасыванию результата. Обычно используется для больших / меньших чеков
  • TEST соответствует вычислению двоичного И операндов, обновлению флагов и отбрасыванию результата. Обычно используется для проверки на равенство.

См. Также: Искусство ассемблера на CMP

Как примечание: Вы должны получить справочные руководства Intel . В частности, в двух частях «Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32», том 2: Справочник по наборам инструкций », в котором описаны все инструкции x86.

9 голосов
/ 29 декабря 2010

JLE инструкция фактически проверяет два флага одновременно:

  • Нулевой флаг (ZF)
  • Несет флаг(CF)

Если флаги Carry и Zero равны 1, будет выполнен короткий относительный прыжок .

Может быть, просто слово как CMPинструкция работает.CMP инструкция похожа на SUB (вычитать), но регистр назначения не будет обновляться после исключения.Поэтому следующий код будет выполнять тот же результат, что и CMP ebx, 10 .Инструкция CMP и SUB влияет на флаги: флаги Carry, Parity, Auxiliary, Zero, Sign и Overflow.

push   ebx            //store ebx value to stack
sub    ebx, 10
pop    ebx            //restore ebx value from stack
4 голосов
/ 29 декабря 2010

Сборка x86 использует систему битовых флагов, которые представляют результат сравнений.Инструкции условного перехода используют эти флаги при принятии решения о том, выполнять переход или нет.

В вашем случае вы должны использовать следующие две инструкции:

cmp ebx, 10     ; compare EBX and 10
jle label       ; jump if the previous comparison is "less than or equal"
…
label:
…
1 голос
/ 30 декабря 2010

JB - работа с числами без знака (переход ниже) <</p>

JL - работа с числами со знаком

mov bx,0     // BX := 0
cmp bx,FF    // 0 < -1 or 0 < 255 (Jump Flag and Sign Flag will change)
jl  butter   // if you use JL jump will not occurs, cus 0 > -1
jb  butter   // if you use JB jump will occurs, cus 0 < 255
...