Команда условного перехода организует передачу управления при выполнении определённого в команде условия, в противном случае переход осуществляется на команду, следующую за инструкцией условного перехода. Условия определяются текущим состоянием флагов процессора. Каждая из 30 команд условных переходов проверяет определенную комбинацию флагов.
Все условные переходы являются короткими, т.е. адрес перехода должен отстоять не далее, чем на - 128 или +127 байтов от первого байта следующей команды.
Jусловие - условный переход .
Это набор команд, выполняющих переход, если удовлетворяется соответствующее условие. При использовании после команды cmp, условия приобретают формулировки, соответствующие отношениям между операндами cmp.
Значение аббревиатур в названии команды jcc
Обозначение
Англ.
Русский
Тип операндов
e
equal
Равно
любые
n
not
Не
любые
g
greater
Больше
числа со знаком
l
less
Меньше
числа со знаком
a
above
Выше (больше)
числа без знака
b
bellow
Ниже (меньше)
числа без знака
Эти команды осуществляют переходы типа short и near
Перечень команд условного перехода для команды cmp
Условие
Мнемокод
со знаком
без знака
ОП-1 =ОП_2
je equal
ОП-1 < >ОП_2
jne not equal
ОП-1 <ОП_2
jl low
jnqe not greater or equal
jb below
jnae not above or equal
ОП-1 <= ОП_2
jle low or equal
jngnot greater
jbe below not equal
jnanotabove
ОП-1 > ОП_2
jggreater
jnle not low or equal
jaabove
jnbe not below or equal
ОП-1 => ОП_2
jge greater or equal
jnlnot lower
jae above or equal
jnbnot below
Циклы
Инструкция, организующая программный цикл имеет вид:
Инструкция loop использует содержимое регистра СХ как счетчик повторений цикла. Команда loop уменьшает содержимое регистра СХ на 1 и передает управление по адресу, определяемому меткой перехода, если содержимое СХ ≠ 0, в противном случае выполняется следующая за LOOP инструкция. Подобно условным переходам инструкции этой группы могут осуществлять только короткие передачи управления, т.е. в пределах от -128 до +127.
Добавление к инструкции loop<условие повторения цикла> позволяет ввести дополнительные логические условия на повторение цикла:
· loope/loopz – повторять, пока ноль;
· loopne/loopnz – повторять, пока не ноль.
Проверка флага ZF осуществляется командой loop. Цикл повторяется, если содержимое СХ ≠ 0 и выполняется соответствующее условие, в противном случае выполняется следующая за loop инструкция.
Пример написания программы работы с массивами слов
· Дан массив из десяти слов, содержащих целые числа. Требуется найти максимальное значение в массиве.
Текст программы:
.data
· max dw ?
· mass dw 10,24,76,479,-347,281,-24,70,124,97
· .stack 100h
· .code
start: mov ax, @data
mov ds, ax ; Загрузить сегментный адрес данных
lea bx, mass ; Загрузить адрес смещения массива
mov cx, 10 ; Установить счетчик повторений цикла
mov ax, [bx] ; Первый элемент массива в Аккумулятор
beg: cmp [bx], ax ; Сравнить текущий элемент массива с максимальным
jl no ; он меньше
mov ax, [bx] ; он больше или равен
no: inc bx ; Следующий элемент
inc bx ; массива
loop beg
mov max, ax
quit: mov ax,4C00h ; Код завершения 0
int 21h ; Выход в DOS
end start
Заменить все отрицательные числа нулями. Массив байт.
.data
· mass db 1,2,7,-4,-34,28,-24,7,12,9
· .stack 100h
· .code
start: mov ax, @data
mov ds, ax ; Загрузить сегментный адрес данных
lea bx, mass ; Загрузить адрес смещения массива
mov cx, 10 ; Установить счетчик повторений цикла
mov al, 0
beg: cmp [bx], ax ; Сравнить текущий элемент массива с нулём
jg no ; он больше
mov [bx], al ; обнуление элемента массива
no: inc bx ; Следующий элемент массива
loop beg
quit: mov ax,4C00h ; Код завершения 0
int 21h ; Выход в DOS
end start
Найти сумму абсолютных величин. Массив байт.
.data
sum db ?
· mass db 1,2,7,-4,-3, 8,-2,7,12,9
· .stack 100h
· .code
start: mov ax, @data
mov ds, ax ; Загрузить сегментный адрес данных
lea bx, mass ; Загрузить адрес смещения массива
mov cx, 10 ; Установить счетчик повторений цикла
beg: mov dl, [bx]
cmp dl, 0 ; Сравнить текущий элемент массива с нулём