Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 2).doc
Скачиваний:
155
Добавлен:
08.03.2015
Размер:
380.93 Кб
Скачать

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

Команды условных переходов передают управление в зависимости от значения некоторого условия. Они записываются в формате:

Jcond Labl,

где cond  формальное условие перехода,и передают управление по метке Labl в случае истинности заданного условия. В противном случае выполняется очередная команда программы.

Все условные переходы являются короткими (тип SHORT). Это обусловлено тем, что в машинном коде команд условных переходов лишь один байт выделен для хранения дистанции disp8 до метки, который и используется для вычисления адреса перехода (IP)=(IP)+disp8(Labl). Отсюда любая команда условного перехода передает управление в пределах от (128) до (+127) байтов.

Большинство команд условных переходов имеют две мнемоники. Выбор той или иной мнемоники позволяет подчеркнуть смысл проверяемого условия перехода и сделать программу более понятной.

Команды условных переходов могут передавать управление в зависимости от различных условий. Все они могут быть разделены на следующие подгруппы:

1) команды перехода по состоянию арифметических флагов;

2) команды перехода по соотношению между числами;

3) команды перехода по состоянию регистра CX.

Команды перехода по состоянию арифметических флагов

Команды этой подгруппы используют в качестве условия перехода состояние арифметических флагов. При этом проверяемое условие перехода cond может принимать следующие фактические значения:

Z/E  нуль/равно (ZF=1), NZ/NE  не нуль/не равно (ZF=0),

C  наличие переноса (CF=1), NC  отсутствие переноса (CF=0),

S  отрицательный результат (SF=1), NS  положительный результат (SF=0),

P/PE  четный паритет (PF=1), NP/PO  нечетный паритет (PF=0),

O  наличие переполнения (OF=1), NO  отсутствие переполнения (OF=0).

Здесь через дробную черту приведены альтернативные названия одного и того же условия.

Таким образом, команды условного перехода по состоянию арифметических флагов в зависимости от проверяемого условия могут записываться в следующем виде: JZ/JE, JNZ/JNE; JC, JNC; JS, JNS; JP/JPE, JNP/JPO; JO, JNO.

Эти команды могут использоваться после любой команды, формирующей соответствующий флаг.

Пример 3.93:

DEC CL

JNZ Begin ; Переход, если (CL) не нуль

. . . . . . . . .

ADD AX, Word ; Сложение знаковых чисел

JO Overflow ; Переход, если переполнение

Команды перехода по соотношению между числами

Команды этой подгруппы используются только после команды сравнения CMP. В результате сравнения формируются флаги, позволяющие проверить все соотношения между числами. Однако, рассматриваемые команды реализуют операторы отношений <, >, < =, > =.

Для анализа результатов сравнения беззнаковых и знаковых чисел служат различные команды условного перехода. Это обусловлено тем, что использование дополнительного кода для представления знаковых чисел вносит существенное различие в интерпретацию результатов сравнения чисел без знака и со знаком.Например, код FFh=11111111b как число без знака имеет значение 255>0, а как число со знаком  (1)<0.

Для устранения этой путаницы при сравнении беззнаковых чисел используются термины "ниже" (Below) "выше" (Above), а при сравнении чисел со знаком  "меньше" (Less)  "больше" (Greater), выбор которых поясняется рис.3.6.

Рис. 3.6. Числовые оси для представления чисел

В соответствии с этим формальное условие cond команд условных переходов по соотношению между беззнаковыми числами может принимать следующие фактические значения:

B/NAE  ниже/не выше и не равно, NB/AE  не ниже/выше или равно, BE/NA  ниже или равно/не выше, NBE/A  не ниже и не равно /выше.

Отсюда команды условных переходов по соотношению между беззнаковыми числами имеют вид: JB/JNAE, JNB/JAE, JBE/JNA, JNBE/JA.

Аналогично условие cond команд условных переходов по соотношению между знаковыми числами может принимать значения:

L/NGE  меньше/не больше и не равно, NL/GE  не меньше/больше или равно,

LE/NG  меньше или равно/не больше, NLE/G  не меньше и не равно/

/больше.

Отсюда команды условных переходов по соотношению между знаковыми числами имеют вид: JL/JNGE, JNL/JGE, JLE/JNG, JNLE/JG.

На практике для выбора команды условного перехода, следующей за командой сравнения (CMP приемник, источник), используется табл. 3.3.

Таблица 3.3

Выбор команд условных переходов в сочетании с командой CMP

Условие перехода

Следующая за CMP команда

для чисел без знака

для чисел со знаком

Приёмник > источник

JA/JNBE

JG/JNLE

Приёмник = источник

JE

JE

Приёмник < > источник

JNE

JNE

Приёмник < источник

JB/JNAE

JL/JNGE

Приёмник < = источник

JBE/JNA

JLE/JNG

Приёмник > = источник

JAE/JNB

JGE/JNL

Для анализа операндов на равенство, то есть для реализации операторов отношений = и < >, необходимо использовать команды JE и JNE из первой подгруппы. В этом случае нет различий в сравнении знаковых и беззнаковых чисел.

Пример 3.94:

Реализовать ветвление программы в зависимости от соотношения между знаковым числом из регистра AL и числом 100.

CMP AL, 100 ; Сравнение (AL) с числом 100

JGE GE100 ; Переход, если (AL)>=100

. . . . . . . . ; Команды для выполнения при (AL)<100

GE100: JG G100 ; Переход, если (AL)>100

. . . . . . . . ; Команды для выполнения при (AL)=100

G100: . . . . . . . . ; Команды для выполнения при (AL)>100