Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция 6 / Лекция 6.doc
Скачиваний:
24
Добавлен:
10.06.2015
Размер:
226.3 Кб
Скачать

Условные переходы

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

-отношение между операндами со знаком (больше или меньше);

-отношение между операндами без знака (выше или ниже)2;

-состояниями арифметических флагов ZF, SF, CF, OF, PF (но не AF).

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

j c c метка_перехода

Как видно, мнемокод всех команд начинается с символа «j» — от слова jump (прыжок). Вместо символов «ее» указывается конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то он определяет метку перехода, которая может находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях процессора (8086, 80186 и 80286) команды условного перехода могли осуществлять только короткие переходы — на расстояние от -128 до +127 байт от команды, следующей за командой условного перехода. Начиная с процессора 80386 это ограничение снято, но, как видите, только в пределах текущего сегмента кода.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого должно приниматься решение. Источниками такого условия могут быть:

-любая команда, изменяющая состояние арифметических флагов;

-команда СМР, сравнивающая значения двух операндов;

-состояние регистра ЕСХ/СХ.

Обсудим эти варианты, чтобы разобраться с тем, как работают команды условного перехода.

Команда сравнения

Команда сравнения СМР (СоМРаге) имеет интересный принцип работы. Он абсолютно такой же, как у команды вычитания SUB (см. главу 8). Команда СМР так же, как и команда SUB, выполняет вычитание операндов и по результатам сравнения устанавливает флаги. Единственное, чего она не делает, — не записывает результат вычитания на место первого операнда.

Синтаксис команды СМР:

сmр операнд_1,операнд_2

Флаги, устанавливаемые командой СМР, можно анализировать специальными командами условного перехода. Прежде чем мы их рассмотрим, уделим немного внимания мнемонике этих команд (табл. 10.1). Понимание обозначений (элементов в названии команды JCC, обозначенных нами символами «ее») при формировании названия команд условного перехода облегчит их запоминание и дальнейшее практическое использование.

Таблица 10.1. Значение аббревиатур в названии команды jcc

Мнемоническое

обозначение

Оригинальный

термин

Перевод

Тип операндов

e

Equal

Равно

Любые

n

Not

Нет

Любые

g

Greater

Больше

Числа со знаком

l

Less

Меньше

Числа со знаком

a

Above

Выше (в смысле больше)

Числа без знака

b

Below

Ниже (в смысле меньше)

Числа без знака

В табл. 10.2 представлен перечень команд условного перехода для команды СМР.

Не удивляйтесь тому обстоятельству, что одинаковым значениям флагов соответствуют несколько разных мнемокодов команд условного перехода (они отделены друг от друга косой чертой). Разница в названии обусловлена желанием разработчиков процессора упростить использование команд условного перехода с разными группами команд. Поэтому разные названия отражают скорее разную функциональную направленность. Тем не менее, то, что эти команды реагируют на одни и те же флаги, делает их абсолютно эквивалентными и равноправными в программе. Именно поэтому они сгруппированы не по названиям, а по значениям флагов (условиям), на которые они реагируют.

Таблица 10.2. Перечень команд условного перехода для команды сmр

Типы

операндов

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

Критерий условного перехода

Значения флагов для перехода

Любые

JE

операнд_1 = операнд_2

ZF=1

Любые

JNE

операнд_1 <> операнд_2

ZF = 0

Со знаком

JL/JNGE

операнд_1 < операнд_2

SF <> OF

Со знаком

JLE/JNG

операнд_1 <= операнд_2

SF <> OF или ZF = 1

Со знаком

JG/JNLE

операнд_1 > операнд_2

SF = OF и ZF = 0

Со знаком

FJGE/JNL

операнд_1 => операнд_2

SF = OF

Без знака

JB/JNAE

операнд_1 < операнд_2

CF=1

Без знака

JBE/JNA

операнд_1 <= операнд_2

СР=1илигр=1

Без знака

JA/JNBE

операнд_1 > операнд_2

CF - 0 и ZF - 0

Без знака

JAE/JNB

опсранд_1 => операнд_2

CF = 0

В качестве примера применения команды CMP рассмотрим фрагмент программы, который обнуляет поле pole_m длиной nбайт:

.data

n equ 50

pole_m db n dup (?)

.code

;…

xor bx.bx ;bx=0

ml: mov mem[bx],0

inc bx

cmp bx,n

jne ml

exit:

;…

Так как команды условного перехода не изменяют флагов, то после одной команды СМР вполне могут следовать несколько команд условного перехода. Это может быть сделано для того, например, чтобы исследовать каждую из альтернативных ветвей: больше, меньше или равно:

.data

mas db dup (?)

.code

;...

cmpmas[si].5 ;сравнить очередной элемент массива с

jeeql; переход, если элемент mas равен 5

jl low ;переход, если элемент mas меньше 5

jg grt ;переход, если элемент mas больше 5

eql:

low:

grt:

Соседние файлы в папке Лекция 6