Передача управления на указанную команду может осуществляться в том случае, когда выполняется какое-нибудь условие. Выполнение условия зависит от того, установлены или нет определяющие это условие биты регистры флагов FL. Такие команды передачи управления называются командами условного перехода. Например, после команды
jne lab1
управление на метку lab1 передается в том и только том случае, когда флаг ZF равен 0. Если же ZF=1, то выполняется команда, следующая за командой перехода. Мнемоническое обозначение jne происходит от слов “jump not equal”, “переход, если не равно”. Имеется ввиду, что перед командой перехода выполнялась команда сравнения двух операндов, и переход надо осуществлять, если эти два операнда не равны.
Таким образом, обычно флаги устанавливаются с помощью команды сравнения
cmp операнд1, операнд2
действие которой аналогично действию команды
sub операнд1, операнд2
вычитания, за исключением того, что команда cmp не записывает результат вычитания на место первого операнда. Например, команды
cmp ax,bx
jne lab1
осуществляют передачу управления на метку lab1 в случае, если значения регистров ax и bx не равны.
В следующем ниже примере мы применяем вместо команды
mov dx,OFFSET mes
команду
lea dx,mes
записи адреса строки с именем mes в регистр dx. Эти команды действуют аналогично.
Пример. Информация о типе компьютера содержится во втором байте, от конца ROM BIOS в виде ключевого байта
Компьютер |
Ключ |
PC |
FF |
XT |
FE |
PCjr |
FD |
AT |
FC |
Напишем программу, читающую байт с адресом FFFFE (из ROM BIOS) и выводящую соответствующее сообщение, например: “Это AT”. Регистр ES устанавливается на последний сегмент ROM BIOS с помощью команд:
mov ax,0f00h
mov es,ax
ибо запись непосредственного операнда 0f00h в ES недопустима. Затем, с помощью команды
mov al,es:[0fffeh]
ключевой байт записывается в al. Сравниваем содержимое с ff, fe, fd, ds и выводим соответствующее сообщение. Если ключ не совпал ни с одним из этих значений, то выводим сообщение об ошибке. Для вывода сообщений используется функция 9 прерывания 21h.
<1> title comp.exe
<2> code SEGMENT
<3> assume cs:code, ds:data
<4> mov ax,data ;инициализация
<5> mov ds,ax ;регистр ds
<6> mov ax,0f000h ;регистр es
<7> mov es,ax ;устанавливается на последний
<8> ;сегмент ROM BIOS
<9> mov al,es:[0fffeh] ;запись ключа в al
<10> cmp al,0ffh ;это PC?
<11> jne lab1 ;если нет
<12> lea dx,mpc ;если да
<13> jmp lab5
<14> lab1: cmp al,0feh ;это XT?
<15> jne lab2 ;если нет
<16> lea dx,mxt ;если да
<17> jmp lab5
<18> lab2: cmp al,0fdh ;это PCjr?
<19> jne lab3 ;если нет
<20> lea dx,mpcjr ;если да
<21> jmp lab5
<22> lab3: cmp al,0fch ;это AT?
<23> jne lab4 ;если нет
<24> lea dx,mat ;если да
<25> jmp lab5
<26> lab4: lea dx,mer ;ошибка
<27> lab5: mov ah,9 ;вывод
<28> int 21h ;сообщения
<29> mov ax,4c00h
<30> int 21h
<31> code ends
<32> data segment
<33> mpc db ‘Это PC’,13,10,’$’
<34> mxt db ‘Это XT’,13,10,’$’
<35> mpcjr db ‘Это PCjr’,13,10,’$’
<36> mat db ‘Это AT’,13,10,’$’
<37> mer db ‘Неизвестный компьютер’,13,10,’$’
<38> data ends
<39> end
В действительности микропроцессор имеет 18 команд условного перехода. Переходы могут осуществляться в зависимости от состояния флагов
ZF, SF, CF, 0F, PF
(но не AF). Для того, чтобы делать переходы на основании выполнения отношений равно, меньше, не меньше, больше, не больше и других, применяется команда CMP. В следующей ниже таблице в левом столбце записаны мнемоники команд перехода. В среднем столбце — условия, которые были определены с помощью команды CMP или другой команды, предшествующей команде перехода. В последнем столбце – значения флагов, при которых команда перехода передаст управление на смещение, указанное операндом.
В командах условного перехода операнды состоят из 1 или двух байт. Управление между сегментами не передается.
Флаги CF и ZF очищаются командой сравнения, когда первый операнд больше второго, если рассматривать операнды как беззнаковые целые числа. В этом случае говорят, что первый операнд выше второго. В случае, когда первый операнд меньше вт
орого, если их рассматривать как беззнаковые целые числа, то говорят, что первый операнд ниже второго. Например, число –1 будет меньше нуля, но это число будет выше нуля, ибо рассматриваемое как беззнаковое, оно равно 0FFFFh=65535.
Команда |
Отношение между операндами команды CMP или свойства результата операции |
Значения флагов |
ja/jnbe |
Выше |
CF=0 и ZF=0 |
jae/jnb |
Выше или равно/ не ниже/ не перенос |
CF=0 |
jb/jnae/jc |
Ниже/перенос |
CF=1 |
jbe/jna |
Ниже или равно/не выше |
CF=1 или ZF=1 |
jcxz/jecxz |
CX=0/ECX=0 |
|
je/jz |
Равно/нуль |
ZF=1 |
jg/jnle |
Больше |
ZF=0 и SF=0F |
jge/jnl |
Больше или равно/не меньше |
SF=0F |
jl/jnge |
Меньше |
SF¹0F |
jle/jng |
Меньше или равно/не больше |
ZF=1 или SF¹0F |
jne/jnz |
Не равно/не нуль |
ZF=0 |
jno |
Не переполнение |
0F=0 |
jnp/jpo |
Не паритет/паритет нечетный |
PF=0 |
jns |
Не знак |
SF=0 |
jp/jpe |
Паритет/паритет четный |
PF=1 |
jo |
Переполнение |
OF=1 |
js |
Знак |
SF=1 |