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

Передача управления на указанную команду может осуществляться в том случае, когда выполняется какое-нибудь условие. Выполнение условия зависит от того, установлены или нет определяющие это условие биты регистры флагов 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