Условный переход на основе команды CMP
Флаги, устанавливаемые командой CMP, можно анализировать специальными командами условного перехода:
Jxx <метка>
где операнд указывает метку той команды программы, на которую надо сделать переход в случае выполнения некоторого условия.
Мнемокод начинается буквой J (от jump), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие. Одна и та же команда условного перехода может иметь в языке ассемблера несколько названий-синонимов (например, «меньше» - «не верно, что больше или равно»).
В таблице 4.1 приведены значения аббревиатур в названии команд условного перехода.
Таблица 4.1.
Значение аббревиатур в названии команд условного перехода.
Мнемоническое обозначение | Английский | Русский | Тип операндов |
E e | equal | Равно | Любые |
N n | not | Не | Любые |
G g | greater | Больше | Числа со знаком |
L l | less | Меньше | Числа со знаком |
A a | above | выше, в смысле “больше” | Числа без знака |
B b | below | ниже, в смысле “меньше” | Числа без знака |
AE ae | above or equal | выше или равно | |
GE ge | greater than or equal | больше или равно |
Замечание. Для условий «меньше» и «больше» введены две системы обозначений, так как после сравнения чисел со знаком и сравнения чисел без знака надо реагировать на разные значения флагов.
В таблице 4.2 приведены названия всех команд условного перехода, используемых после команды сравнения (через косую черту указаны названия-синонимы).
Таблица 4.2.
Перечень команд условного перехода для команды CMPdst, src
Типы операндов | Мнемокод команды условного перехода | Критерий условного перехода | Значения флагов для осуществления перехода |
Любые | je | dst = src | zf = 1 |
Любые | jne | dst<>src | zf = 0 |
Со знаком | jl/jnge | dst < src | sf <> of |
Со знаком | jle/jng | dst <= src | sf <> of or zf = 1 |
Со знаком | jg/jnle | dst > src | sf = of and zf = 0 |
Со знаком | jge/jnl | dst => src | sf = of |
Без знака | jb/jnae | dst < src | cf = 1 |
Без знака | jbe/jna | dst <= src | cf = 1 or zf=1 |
Без знака | ja/jnbe | dst > src | cf = 0 and zf = 0 |
Без знака | jae/jnb | dst => src | cf = 0 |
Examle 4.2.Пусть X, Y, Z - -переменные размером в слово. Записать в Z значение максимального из чисел X и Y.
Решение этой задачи различно для чисел со знаком (см. слева) и для чисел без знака (см. справа), т. к. приходится использовать разные команды условного перехода:
;числа со знаком | ;числа без знака | |||||
MOV | АХ, Х | MOV | АХ, Х | |||
СМР | AX, Y | ; х=у? | СМР | AX, Y ;х = у ? | ||
JGE | М | ; если х >= у, то метка M | JAE | M | ||
MOV | AX, Y | MOV | AX, Y | |||
M: | MOV | Z, AX | M: | MOV | Z, AX |