Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.5.1. Операторы условных переходов

    Формат оператора условного перехода:

КОП     a    ,

где  a - метка, или метка + (-) выражение, вычисление которого дает константу. Операнд a указывает на тот оператор в программе, на который делается переход в случае выполнения предусмотренных в операторе перехода условий. Такими условиями являются значения одного, двух или трех флажков.

Машинная команда, соответствующая оператору условного перехода, имеет длину 2 байта. В первом байте находится КОП, а во втором – “расстояние” между содержимым указателя команды IP и искомым адресом. Это «расстояние» есть число со знаком, т.к. переходы могут делаться как вперед по программе, так и назад.

В одном байте можно разместить число со знаком (в дополнительном коде) от –128 до +127. Это приводит к тому, что оператор условного перехода может использоваться лишь для небольших переходов. Для выполнения больших переходов, в том числе и в другие сегменты памяти, оператор данного типа дополняется операторами безусловного перехода.

Пример. Подсчитаем содержимое второго байта в операторе перехода в следующем фрагменте:

 

0050   Again:    inc     cx

0052                 add    ax, [bx]

0054                  jz     Again

0056   Next:      mov  [Result], cx

 

В момент выполнения jz  (IP)=0056h. Следовательно, второй байт jz должен содержать –6. В дополнительном коде это FAh.

Некоторые операторы условного перехода:

jz (или je) – перейти, если нуль или равно. Условием перехода является ZF = 1;

jnz (или jne) – перейти, если не нуль или не равно. Условие перехода: ZF = 0.

Следующие операторы перехода записывают в программу только после операторов, выполняющих действие над беззнаковыми данными. Эти операторы перехода не учитывают ни флаг знака SF ни флаг переполнения OF. Для них важен флаг переноса CF:

ja (или jnbe) – перейти, если больше. Условие:  (CF = 0) & (ZF = 0);

jae(или jnb) – перейти, если больше или равно. Условие:  CF = 0;

jb (или jnae) – перейти, если меньше. Условие:  CF = 1;

jbe (или jna) -  перейти, если не больше. Условие:  (CF = 1) V (ZF = 1) .

Cледующие операторы перехода записывают в программу только после операторов, выполняющих действия над знаковыми данными. Для них важны флаг знака SF и флаг переполнения OF:

jg (или jnle) – перейти, если больше. Условие:  (SF = OF)&(ZF = 0);

jge (или jnl) – перейти, если больше или равно. Условие:  SF = OF;

jl (или jnge) – перейти, если меньше. Условие: SF ¹  OF;

jle (или jng) – перейти, если меньше или равно. Условие: (SF¹OF) V (ZF=1).

Каждому условному оператору перехода соответствует противоположный по смыслу оператор. Несмотря на логическую эквивалентность двух фрагментов программ, продолжительность их выполнения скорее всего будет различной. Дело в том, что время выполнения условного оператора в случае перехода в четыре раза больше времени выполнения этого же оператора, если переход не делается. Поэтому из двух альтернативных фрагментов желательно использовать тот, в котором вероятность перехода по условному оператору меньше.

 


Предыдущий раздел В начало Следующий раздел