Условные переходы
Инструкция условного перехода может либо осуществлять переход на метку назначения, либо нет, в зависимости от состояния регистра флагов. Например:
...
MOV AH,1 ;Функция Dos чтения клавиатуры
INT 21h ;получить следующий символ
CMP AL,'A' ;был нажат 'A'?
JE AWasTyped;да, обработать его
MOV [TempByte],AL ;нет, запомнить символ
...
AWasTyped:
PUSH AX ;сохранить символ в стеке
...
В начале, этот код читает символ с клавиатуры. Затем он использует инструкцию CMP для сравнения введенного символа с символом 'A'. Инструкция CMP подобна SUB, только без действия; вся цель CMP - это позволить Вам сравнить 2 операнда без изменения их.
Однако CMP, так же как и SUB, устанавливает флаги. Так в предыдущем коде, флаг нуля устанавливается в 1, только если AL содержит символ 'A'.
Сейчас мы пришли к сути примера. JE - это инструкция условного перехода, которая выполняет переход, только если флаг нуля 1, иначе будет выполняться инструкция, следующая после JE, в этом случае - инструкция MOV. Только если был нажат символ 'A', флаг нуля будет установлен и только в этом случае, Ассемблер будет выполнять переход на инструкцию с меткой AWasTyped - инструкцию PUSH.
Микропроцессор Intel поддерживает значительное число условных переходов, предоставляя возможность выполнять переход только по одному флагу, или по любой комбинации флагов. Вы можете выполнить условный переход по состоянию флагов: нулевого, переноса, знака, четности и переполнения и по комбинации флагов, которые указывают на результаты операций со знаковыми числами.
Таблица 5. суммирует инструкции условных переходов.
Инструкции условных переходов. Табл.5
Имя Значение Проверяемые флаги
JB/JNAE переход, если меньше/переход, если CF=1
не больше или равно
JAE/JNB переход, если больше или равно/ CF=0
переход, если не меньше
JBE/JNA переход, если меньше или равно/ CF=1 или ZF=1
переход, если не больше
JA/JNBE переход, если больше/
переход, если не меньше или равно CF=0 и ZF=0
JE/JZ переход, если равно ZF=1
JNE/JNZ переход, если не равно ZF=0
JL/JNGE переход, если меньше, чем/ SF не равно OF
переход, если не больше, чем или
равно
JGE/JNL переход, если больше, чем или равно/ SF=OF
переход, если не меньше, чем
JLE/JNG переход, если меньше, чем или равно/ ZF=1 или
переход, если не больше, чем SF не равно OF
JG/JNLE переход, если больше, чем/
переход, если не меньше, чем или ZF=0 или SF=OF
равно
JP/JPE переход, если паритет/
переход, если четный паритет PF=1
JNP/JPO переход, если нет паритета/
переход, если нечетный паритет PF=0
JS переход, если знак SF=1
JNS переход, если нет знака SF=0
JC переход, если перенос CF=1
JNC переход, если нет переноса CF=0
JO переход, если переполнение OF=1
JNO переход, если нет переполнения JF=0
Здесь CF= флаг переноса; SF= флаг знака; OF= флаг переполнения;
ZF= флаг нуля; PF= флаг паритета
Несмотря на гибкость, инструкции условных переходов имеют серьезное ограничение: это всегда короткие переходы. Другими словами метка назначения для инструкции условного перехода должна быть в пределах 128 байт от инструкции.
Например, Ассемблер не может ассемблировать:
...
JumpTarget:
...
DB 1000 DUP (?)
...
DEC AX
JNZ JampTarget
...
Поскольку JumpTarget находится в пределах более 1000 байт от инструкции JNZ, его нужно изменить так:
...
JumpTarget:
...
DB 1000 DUP (?)
...
DEC AX
JZ SkipJump
JMP JampTarget
SkipJump:
...
где условный переход используется для принятия решения о том, нужно ли делать дальний безусловный переход.