double arrow

Условные переходы

Инструкция условного перехода может либо осуществлять переход на метку назначения, либо нет, в зависимости от состояния регистра флагов. Например:

...

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:

...

где условный переход используется для принятия решения о том, нужно ли делать дальний безусловный переход.


Сейчас читают про: