Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12-12-2013_11-21-32 / пособие_m.doc
Скачиваний:
76
Добавлен:
10.05.2015
Размер:
484.35 Кб
Скачать
    1. Команды передачи управления

Линейными программами обойтись невозможно и в разветвляющихся и циклических программах, а также при организации подпрограмм необходимо выполнять не следующую по порядку команду, а команду, которая находится в другой ячейке памяти. Специальные команды, которые изменяют указатели программной памяти – регистры CS:EIP, называются командами передачи управления.

Сегментная организация программной памяти определяет наличие двух разновидностей команд передачи управления. Передача управления внутри текущего сегмента кода называется внутрисегментной – при этом происходит изменение только регистра EIP, а адрес перехода задает смещение (байт, слово или двойное слово) внутри этого сегмента. Такая передача управления называется близкой или имеющей тип NEAR.

Передача управления за пределы текущего сегмента кода называется межсегментной – при этом необходимо изменить содержимое регистров CS и EIP, а адрес перехода задается полным 32- или 48-разрядным указателем селектор:смещение. Такая передача называется далекой или имеющей тип FAR, так как она позволяет перейти к любой ячейке адресного пространства памяти.

В ассемблерных программах адрес перехода задается просто меткой той команды, которой передается управление. Ассемблер в соответствии с типом NEAR или FAR формирует требуемую команду, а все детали передачи управления процессор реализует автоматически.

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

Микропроцессоры семейства INTEL имеют много команд условных переходов Jcc, которые позволяют проверить любое отношение между знаковыми (больше – меньше) и беззнаковыми (выше – ниже) числами, а также состояние всех арифметических флагов, кроме флага AF. Данные команды позволяют проверить оба состояния всех флагов, а также несколько комбинаций состояния этих флагов. Если условие истинно, то управление передается по адресу перехода путем прибавления к содержимому EIP значения смещения imm8/16/32, которое рассматривается как знаковое число для возможности изменения значения EIP как в сторону увеличения, так и в сторону уменьшения его значения, а если условие ложно, то выполняется следующая по порядку команда. Данные команды имеют следующую форму:

Jcc imm8/16/32

Необходимо отметить, что большинство команд условных переходов имеют несколько мнемоник, которые позволяют более точно подчеркнуть содержательный смысл проверяемого условия.

В подгруппу команд условных переходов беззнаковых входят следующие команды. Команда JA/JNBE, используя флаги CF и ZF, реализует функцию “перейти, если выше/не ниже или равно”. Команда JAE/JNB осуществляет функцию “перейти, если выше или равно/не ниже”. Команда JB/JNAE, используя флаг CF, реализует функцию “перейти, если ниже/не выше или равно”, а команда JBE/JNA, используя флаги СF и ZF, осуществляет функцию “перейти, если ниже или равно/не выше”.

В подгруппу команд условных переходов знаковых входят следующие команды. Команда JG/JNLE, используя флаги SF, OF и ZF, реализует функцию “перейти, если больше/не меньше или равно”, а команда JGE/JNL, используя флаги SF и OF, реализует функцию “перейти, если больше или равно/не меньше”.

Команда JL/JNGE, используя флаги SF и OF, осуществляет функцию “перейти, если меньше/не больше или равно”, а команда JLE/JNG, используя флаги SF, OF и ZF, реализует функцию “перейти, если меньше или равно/не больше”.

Команда JO, используя флаг OF (OF=1), осуществляет функцию “перейти, если есть переполнение”, а команда JNO, используя тот же флаг (OF=0), реализует функцию “перейти, если нет переполнения”.

Команда JS, используя флаг SF (SF=1), реализует функцию “перейти, если есть знак (число отрицательное)”, а команда JNS, используя тот же флаг (SF=0), реализует функцию “перейти, если нет знака (число положительное)”.

В последнюю подгруппу команд условной передачи входят следующие команды. Команда JC, используя флаг CF (СF=1), реализует функцию “перейти, если есть перенос”, а команда JNC, используя тот же флаг (CF=0), реализует функцию “перейти, если нет переноса”.

Команда JE/JZ, используя флаг ZF (ZF=1), реализует функцию “перейти, если равно”, а команда JNE/JNZ, используя тот же флаг (ZF=0), реализует функцию “перейти, если не равно”. Команда JP, используя флаг паритета (PF=1), реализует функцию “перейти, если паритет четный”, а команда JNP, используя тот же флаг (PF=0), реализует функцию “перейти, если паритет нечетный”.

Две команды осуществляют условный переход, проверяя содержимое счетчика CX/ECX. Команда JCXZ реализует функцию ”перейти, если содержимое регистра CX=0”, а команда JECXZ реализует функцию “перейти, если содержимое регистра ECX=0”.

Описанные в данном разделе условия выполнения передачи управления, также используются в командах условной передачи данных CMOVcc и в командах условной установки SETcc, описанных в разделе 4.2.

Соседние файлы в папке 12-12-2013_11-21-32