Инструменты пользователя

Инструменты сайта


examination:asm:question44

Вопрос №44. Условные переходы

Команды условного перехода

Команды условного перехода предназначены для передачи управления участку кода, указанному на какой-то определенной метке в зависимости от заданного условия, если условие выполнено, то происходит переход далее, таких команд довольно много, однако они являются синонимичными. Как правило команды условного перехода проверяют значения флагов ( а установка флагов как правило осуществляется командой cmp- проверка чисел)


JZ/JE нуль или равно ZF=1

JNZ/JNE не нуль или не равно ZF=0

JC/JNAE/JB есть переполнение/не выше и не равно/ниже CF=1

JNC/JAE/JNB нет переполнения/выше или равно/не ниже CF=0

JP число единичных бит чётное PF=1

JNP число единичных бит нечётное PF=0

JS знак равен 1 SF=1

JNS знак равен 0 SF=0

JO есть переполнение OF=1

JNO нет переполнения OF=0

JA/JNBE выше/не ниже и не равно CF=0 и ZF=0

JNA/JBE не выше/ниже или равно CF=1 или ZF=1

————-знаковые——————————- JG/JNLE больше/не меньше и не равно ZF=0 и SF=OF

JGE/JNL больше или равно/не меньше SF=OF

JL/JNGE меньше/не больше и не равно SF?OF

JLE/JNG меньше или равно/не больше ZF=1 или SF?OF

JCXZ содержимое CX равно нулю CX=0

Команды условного перехода - группа команд, призванных самостоятельно принимать решение о том, какая команда должна выполняться следующей. Решение принимается в зависимости от определенных условий, определяемых конкретной командой перехода. Процессор поддерживает 18 команд условного перехода, позволяющих проверить:

  1. отношение между операндами со знаком (больше или меньше)
  2. отношение между операндами без знака (выше или ниже)
  3. состояниями арифметических флагов ZF, SF, CF, OF, PF

Команды условного перехода имеют одинаковый синтаксис:

Jcc метка_перехода

Мнемокод всех команд начинается с символа j – от слова jump. Вместо cc указывается конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то он определяет метку перехода, которая может находиться только в пределах текущего сегмента кода; межсегментной передач управления в условных переходах не допускается.

а теперь другой вариант)

JCC Схема команды:

jcc метка

jcxz метка

jecxz метка

Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.

Синтаксис

Алгоритм работы команд (кроме jcxz/jecxz):

Проверка состояния флагов в зависимости от кода операции (оно отражает проверяемое условие):

если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом;

если проверяемое условие ложно, то передать управление следующей команде.

Алгоритм работы команды jcxz/jecxz:

Проверка условия равенства нулю содержимого регистра ecx/cx:

если проверяемое условие истинно, то есть содержимое ecx/cx равно 0, то перейти к ячейке, обозначенной операндом метка;

если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0, то передать управление следующей за jcxz/jecxz команде программы.

Применение (кроме jcxz/jecxz):

Команды условного перехода удобно применять для проверки различных условий, возникающих в ходе выполнения программы. Как известно, многие команды формируют признаки результатов своей работы в регистре eflags/flags. Это обстоятельство и используется командами условного перехода для работы. Ниже приведены перечень команд условного перехода, анализируемые ими флаги и соответствующие им логические условия перехода. Команда Состояние проверяемых флагов Условие перехода

JA CF = 0 и zf = 0 если выше

JAE CF = 0 если выше или равно

JB CF = 1 если ниже

JBE CF = 1 или zf = 1 если ниже или равно

JC CF = 1 если перенос

JE ZF = 1 если равно

JZ ZF = 1 если 0

JG ZF = 0 и sf = of если больше

JGE SF = of если больше или равно

JL SF <> OF если меньше

JLE ZF=1 или sf <> OF если меньше или равно

JNA CF = 1 и zf = 1 если не выше

JNAE CF = 1 если не выше или равно

JNB CF = 0 если не ниже

JNBE CF=0 и zf=0 если не ниже или равно

JNC CF = 0 если нет переноса

JNE ZF = 0 если не равно

JNG ZF = 1 или sf <> OF если не больше

JNGE SF <> OF если не больше или равно

JNL SF = of если не меньше

JNLE ZF=0 и sf=of если не меньше или равно

JNO OF=0 если нет переполнения

JNP PF = 0 если количество единичных битов результата нечетно (нечетный паритет)

JNS SF = 0 если знак плюс (знаковый (старший) бит результата равен 0)

JNZ ZF = 0 если нет нуля

JO OF = 1 если переполнение

JP PF = 1 если количество единичных битов результата четно (четный паритет)

JPE PF = 1 то же, что и JP, то есть четный паритет

JPO PF = 0 то же, что и JNP

JS SF = 1 если знак минус (знаковый (старший) бит результата равен 1)

JZ ZF = 1 если ноль

Логические условия «больше» и «меньше» относятся к сравнениям целочисленных значений со знаком, а «выше и «ниже» — к сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у многих команд можно заметить одинаковые значения флагов для перехода. Это объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое состояние флагов. В этом случае с целью удобства ассемблер допускает несколько различных мнемонических обозначений одной и той же машинной команды условного перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это одна и та же машинная команда. Изначально в микропроцессоре i8086 команды условного перехода могли осуществлять только короткие переходы в пределах -128…+127 байт, считая от следующей команды. Начиная с микропроцессора i386, эти команды уже могли выполнять любые переходы в пределах текущего сегмента команд. Это стало возможным за счет введения в систему команд микропроцессора дополнительных машинных команд. Для реализации межсегментных переходов необходимо комбинировать команды условного перехода и команду безусловного перехода jmp. При этом можно воспользоваться тем, что практически все команды условного перехода парные, то есть имеют команды, проверяющие обратные условия.

Применение jcxz/jecxz:

Команду jcxz/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128…+127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой.

examination/asm/question44.txt · Последние изменения: 2014/01/15 08:13 (внешнее изменение)