- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Команды условных переходов
Команды условных переходов передают управление в зависимости от значения некоторого условия. Они записываются в формате:
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