Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ВС-пособие.docx
Скачиваний:
9
Добавлен:
01.05.2025
Размер:
728.99 Кб
Скачать

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

Данные команды позволяют процессору "принять решение" о ходе выполнения программы в зависимости от определённых условий.

 Jx   <Метка перехода>

 х  - модификатор, состоящий из одной, двух или трёх букв.

Мнемонический код этой команды всегда начинаются с буквы J от первой буквы английского слова  Jump ("перейти"). Остальные буквы могут быть следующими (они определяются в зависимости от условия):

Буква мнемокода

Условие

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

Е

равно

любые

N

не равно

любые

G

больше

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

L

меньше

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

А

выше, в смысле “больше”

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

В

ниже, в смысле “меньше”

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

 

Что касается операнда <Метка перехода>, то эта метка может находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях микропроцессора (i8086, i80286) команды условного перехода могли осуществлять только короткие переходы - на расстояние от -128 до +127 байтов от команды условного перехода. Начиная с модели i80386, это ограничение снято, но только в пределах текущего сегмента кода.

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

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

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

- состояние регистра ECX/CX.

Формат команды CMP:

CMP операнд1, операнд2

Эта команда осуществляет, по сути, вычитание операнд1 - операнд2, однако результат никуда не записывает, а только устанавливает флаги в соответствие с нижеприведенной таблицей.

Сравниваемые операнды

Флаги

OF

SF

ZF

CF

Операнды без знака

Источник < приемник

-

-

0

1

Источник = приемник

-

-

1

0

Источник > приемник

-

-

0

0

Операнды со знаком

Источник < приемник

0/1

1

0

-

Источник = приемник

0

0

1

-

Источник > приемник

0/1

0

0

-

Приведем еще одну таблицу, в которой отражается действие команд условного перехода по значениям анализируемых этими командами флагов:

Мнемокод команды

Критерий перехода

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

Тип операндов: любые числа

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

JGE/JNL

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

SF=OF

Тип операндов: числа без знака

JB/JNAE

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

CF=1

JBE/JNA

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

CF=1 или ZF=1

JA/JNBE

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

CF=0 и ZF=0

JAE/JNB

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

CF=0


Команды условного перехода без использования команды сравнения

мнемокод

Описание

Проверяемые флаги

JC

Перейти при переносе (аналогично JB)

CF=1

JNC

Перейти при отсутствии переноса

CF=0

JO

Перейти при переполнении

OF=1

JNO

Перейти при отсутствии переполнения

OF=0

JP/JPE

Перейти при четности

PF=1

JNP/JPO

Перейти при нечетности

PF=0

JS

Перейти при наличии отрицательного знака

SF=1

JNS

Перейти при отсутствии отрицательного знака

SF=0


 

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

JCXZ

Перейти, если содержимое CX - 0

CX=0

Важно отметить ограничения, свойственное команде JCXZ: в отличие от других команд условной передачи управления, эта команда может адресовать только короткие переходы - на -128 байтов или на +127 байтов от следующей за ней командой.

Если при программировании условия Вы воспользовались арифметической командой, то после неё уже не надо применять команду сравнения, поскольку дальнейшее сравнение результата будет осуществляться с 0 (если, конечно, Вы не будете сравнивать результат с другим операндом).

Рассмотрим некоторые арифметические команды, которые могут быть использованы в качестве условия: ADD, ADC, SUB, SBB, MUL, IMUL. Все эти команды вычитают операнд-источник из операнда-приёмника и в зависимости от результата устанавливают или обнуляют флаги.

Укажем  значения флагов после выполнения ADD, ADC, SUB и SBB:

CF=1, если результат не помещается в операнде-приёмнике;

PF=1, если результат имеет чётное число битов;

ZF=1, если результат равен 0;

SF=1, если результат отрицателен;

OF=1, если результат превышает диапазон допустимых значений приёмника в обратном коде.

Отметим, что содержимое SF и OF имеют смысл только при сложении и вычитании чисел со знаком.