Пример инструкции по сборке JLE jmp

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

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

JL label
"It" jumps if it is less than or if it is not larger than or equal to.

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

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


person bobobobo    schedule 29.12.2010    source источник


Ответы (4)


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

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

Смотрите также: Искусство языка ассемблера на CMP

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

person CodesInChaos    schedule 29.12.2010
comment
В этом примере происходит ли скачок JLE, когда 10 меньше или равно ebx, или когда ebx меньше или равно 10? - person Anderson Green; 20.02.2013
comment
@AndersonGreen Он прыгает, когда содержимое ebx равно ‹= 10. - person d0rmLife; 19.03.2013
comment
@AndersonGreen: Intel выбрала мнемонику, поэтому cmp x,y / jcc совпадают с x <= y. felixcloutier.com/x86/jcc. Проще всего напомнить себе, что jb — это та же инструкция, что и jc, перейти, если CF=1. (Это одна из худших частей синтаксиса AT&T: обратные операнды к cmp означают, что семантические значения для мнемоники jcc обратны порядку операндов в источнике.) - person Peter Cordes; 25.01.2021

JLE инструкция проводит два теста:

  • Флаг подписания (SF) != Флаг переполнения (OF)
  • Флаг Нулевой (ZF) == 1

Если Zero flags равен 1, а Signed Flag и Overflow Flag не равны, то будет выполнен короткий относительный переход.

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

push   ebx            //store ebx value to stack
sub    ebx, 10
pop    ebx            //restore ebx value from stack
person GJ.    schedule 29.12.2010

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

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

cmp ebx, 10     ; compare EBX and 10
jle label       ; jump if the previous comparison is "less than or equal"
…
label:
…
person Ondrej Tucny    schedule 29.12.2010

JB - работа с числами без знака (Jump Below) ‹

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
person Mario Augusto    schedule 30.12.2010