Команды передачи управления.




Практически в любой программе есть точки (места программы), в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть двух видов:

1) безусловным, то есть произойдет переход не к следующей по порядку команде, а к указанной;

2) условный переход, то есть произойдет переход не к следующей по порядку команде, а к той, которая будет выполняться исходя из анализа некоторых условий.

Команда безусловного перехода:

JMP метка – заставляет процессор продолжать выполнение программы с места, отмеченного меткой, которая указывается в самой команде JMP (jump)

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

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

Для анализа соотношения между операндами перед командой условного перехода должна быть выполнена команда сравнения операндов:

CMP операнд1, операнд2

Эта команда, как и команда SUB, выполняет вычитание операндов (из операнд1 вычитается операнд2), в результате выполнения вычитания (то есть в результате выполнения этой команды процессор выставляет флаги в регистре флагов) выставляет необходимые флаги, НО не записывает полученный результат вычитания на место первого операнда. По результатам анализа флагов возможно произвести необходимый условный переход. Существуют следующие команды условного перехода, выполняемые после команды CMP:


 

Типы операндов Команда условного перехода Критерий условного перехода Значение флагов для перехода
Любые JE операнд1 = операнд2 ZF=1, т.е. ЦП видит команду CMP, он находит разность двух операндов и выставляет флаги. Потом он смотрит следующую команду. Если стоит JE, то ЦП смотрит на флаг ZF. Если этот флаг равен не 1, а нулю, то ЦП перейдет к рассмотрению следующей команды.
Любые JNE операнд1 <> операнд2 ZF=0
Со знаком JL или JNGE операнд1 < операнд2 SF<>OF
Со знаком JLE или JNG операнд1 <= операнд2 SF<>OF или ZF=1
Со знаком JG или JNLE операнд1 > операнд2 SF=OF и ZF=0
Со знаком JGE или JNL операнд1 => операнд2 SF=OF
Без знака JB или JNAE операнд1 < операнд2 CF=1
Без знака JBE или JNA операнд1 <= операнд2 CF=1 или ZF=1
Без знака JA или JNBE операнд1 > операнд2 CF=0 и ZF=0
Без знака JAE или JNB операнд1 => операнд2 CF=0

 

Буквы в обозначениях команд имеют следующие значения:

J – jump, e – equal (равно), n – not (нет), g – greater (больше), l – less (меньше), а – above (выше, в смысле больше), b – below (ниже, в смысле меньше).

Например, JL или JNGE = перейти, если операнд1 меньше операнда2, ИЛИ перейти, если не выполняется условие, что операнд1 больше или равен операнда2.

Команды условного перехода имеют следующий формат:

Jcc метка

где cc – код конкретного условия, анализируемого командой.

Поскольку команды условного перехода не меняют флаги процессора, то после команды CMP может быть указано несколько команд условного перехода. Таким образом, можно организовать ветвление программы в зависимости от результатов сравнения двух операндов. Например,

CMP AL, AH; сравниваем значения AL и AH

JE metka1; если равны AL=AH, то переход

;к команде перед которой стоит metka1

JL metka2

JG metka3

Другим вариантом команд условного перехода являются команды, которые просто анализируют состояние определенных флагов процессора. Обозначение этих команд состоит также из символа “J” (jump) и одной буквы, отражающей название флага, перед которой может быть вставлен символ отрицания “n” (not).

Ниже приведен список команд условного перехода, использующих анализ флагов процессора.

Название флага Номер бита в регистре eflags/flags Команда условного перехода Значение флага для осуществления перехода
Переноса CF   JC CF = 1
Четности PF   JP PF = 1
Нуля ZF   JZ ZF = 1
Знака SF   JS SF = 1
Переполнения OF   JO OF = 1
Переноса CF   JNC CF = 0
Четности PF   JNP PF = 0
Нуля ZF   JNZ ZF = 0
Знака SF   JNS SF = 0
Переполнения OF   JNO OF = 0

Например:

JC metka; если флаг переноса равен 1, то переход к команде,

перед которой стоит metka

Кроме того, есть еще две команды, предназначенные специально для работы с регистром CX/ECX (предназначены для организации циклов с использование регистров CX/ECX в качестве счетчика):

JCXZ metka (Jump if CX is Zero) - если регистр CX содержит ноль, то переход к команде, перед которой стоит metka;

JECXZ metka (Jump if ECX is Zero) – переход, если регистр ECX содержит ноль.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: