Есть 31 команда условной передачи управления (УПУ), но некоторые попарно совпадают, например: «если >» и «если не < и не =». Разных команд всего 17. Условная передача управления может быть только ближней (near) и короткой (short), то есть метка перехода должна быть в том же сегменте и не далее ±128 байтов от УПУ.
Общий формат команды:
J* метка
где J* — условие передачи управления при выполнении условия).
Команда передает управление по прямому адресу — метке, если условие, указанное в команде, соблюдается; в противном случае выполняется следующая по порядку команда. Выполнение условия определяется состояниями флагов регистра FL, которые установлены по результатам предыдущих формирующих условие перехода операций: арифметических, логических, сравнения и т. д.
Команды условной передачи управления могут быть знаковыми (условие проверяется с учетом знака операндов) и беззнаковыми (условие проверяется по абсолютным значениям операндов). Каким типом УПУ пользоваться, определяется по содержанию решаемой задачи и, соответственно, типами данных (знаковых или беззнаковых), над которыми выполнялись операции, формирующие условие перехода.
|
|
Надо четко различать J* без знака (если сравниваются целые, без знака) и сознаком (если сравниваются целые со знаком), иначе результат будет совсем не тем (неверным).
Например, пусть регистр AX содержит 11000110, а регистр BX — 00010110, и команда CMP AX, BX сравнивает содержимое этих регистров. Если данные беззнаковые, то число в AX больше, а если знаковые — то меньше (поскольку в последнем случае единица в крайнем левом разряде определяет знак числа — в AX число отрицательное).
Команды условной передачи управления для беззнаковых данных
l JA/JNBE (Jump if Above/Not Below nor Equal) — переход, если выше/не ниже или равно (переход, если флаги ZF = 0 и CF = 0).
l JAE/JNB (Jump if Above or Equal/Not Below) — переход, если выше или равно/не ниже (CF = 0).
l JB/JNAE (Jump if Below/Not Above nor Equal) — переход, если ниже/не выше или равно (CF = 1).
l JBE/JNA (Jump if Below or Equal/Not Above) — переход, если ниже или равно/не выше (CF = 1 или AF = 1).
Команды условной передачи управления для знаковых данных
l JG/JNLE (Jump if Greater/Not Less nor Egual) — переход, если больше/не меньше или равно (ZF = 0 и SF = OF).
l JGE/JNL (Jump if Greater or Equal/Not Less) — переход, если больше или равно/не меньше (SF = OF).
l JL/JNGE (Jump if Less/Not Greater nor Equal) — переход, если меньше/не больше или равно (SF >< OF).
l JLE/JNG (Jump if Less or Equal/Not Greater) — переход, если меньше или равно/не больше (ZF = 1 или SF >< OF).