Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Формат оператора условного перехода:
КОП 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).
Каждому условному оператору перехода соответствует противоположный по смыслу оператор. Несмотря на логическую эквивалентность двух фрагментов программ, продолжительность их выполнения скорее всего будет различной. Дело в том, что время выполнения условного оператора в случае перехода в четыре раза больше времени выполнения этого же оператора, если переход не делается. Поэтому из двух альтернативных фрагментов желательно использовать тот, в котором вероятность перехода по условному оператору меньше.
Предыдущий раздел | В начало | Следующий раздел |