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

Команды передачи управления реализуют изменение естественного порядка выполнения команд программы. Их можно разделить на 3 подгруппы. В мнемонические обозначения команд условного перехода входят буквы, которые определяют условия в соответствии с таблицей 3. В этой таблице операнд "метка перехода" или "близкая метка" отражает тот факт, что метка помеченной команды должна находиться в пределах текущего сегмента кода и на относительном расстоянии от команды перехода >-128 и < 127 байтов. Ограничение (-128..127) байтов снято у процессоров, начиная с модели 80386, однако ограничение передачи управления в пределах текущего сегментного кода действует и в моделях PENTIUM.

Таблица 3. Мнемокоды команд условного перехода.

Буква мнемокода Условие Тип перехода
E Равно Любые
N Не равно Любые
G Больше Числа со знаком
L Меньше Числа со знаком
A Выше, в смысле «больше» Числа без знака
B Ниже, в смысле «меньше» Числа без знака

Решение о том, куда будет передано управление командой условного перехода, принимается на основании условия. Источниками таких условий могут быть:

-любая команда, изменяющая состояние арифметических флагов (ниже эти флаги будут перечислены);

-команда сравнения CMP.

Формат команды CMP:

CMP приемник, источник или CMP операнд1, операнд2.

Эта команда осуществляет вычитание (операнд1 - операнд2) или (приемник- источник), однако результат никуда не записывается, а только устанавливает флаги в соответствие с таблицей 4.

Таблица 4. Значения флагов, устанавливаемые командой СМР

Сравниваемые операнды Флаги
OF SF ZF CF
Операнды без знака  
Источник < приёмник H H
Источник = приёмник H H
Источник > приёмник H H
Операнды со знаком  
Источник < приёмник 0/1 H
Источник = приёмник H
Источник > приёмник 0/1 H

В этой таблице приняты следующие обозначения:

-"H" означает, что 'не имеет значения" или иначе, на этот флаг операция не влияет;

- 0/1 означает, что флаг устанавливается или в 1 или в 0 в зависимости от значений операндов (отрицательные или положительные или разнознаковые операнды сравниваются).

Приведем еще одну таблицу 5, в которой отражается действие команд условного перехода по значениям анализируемых этими командами флагов. В этой таблице через слеш '/' перечисляются идентичные команды, действие которых совершенно одинаково, и применение конкретной из них зависит от пристрастий программиста. Наличие идентичных команд объясняется тем фактом, что если число_1 >число_2, то можно с уверенностью утверждать, что число_1 не (меньше или равно) число_2.

Таблица 5. Логика команд условного перехода.

Тип операндов Мнемокод команды Критерий перехода Значение флагов для перехода
Любые JE Операнд_1 = Операнд_2 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
Со знаком JG/JNL Операнд_1 >= Операнд_2 SF=OF
Без знака JGE/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

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

Безусловный переход в программе на ассемблере производится по команде JMP. Полный формат команды следующий: JMP [модификатор] адрес_перехода.

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

В системе команд микропроцессора существуют несколько кодов машинных команд безусловного перехода. Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным или близким, а во втором случае -межсегментным или дальним.

Внутрисегментный переход предполагает, что изменяется только содержимое регистра IP. Можно выделить три варианта внутрисегментного перехода: прямой короткий, прямой, косвенный.

Прямой короткий внутрисегментный переход применяется,
когда расстояние от команды JMP до адреса перехода не более чем 127 байтов выше или ниже. В этом случае транслятор языка формирует машинную команду безусловного перехода длиной 2 байта: первый байт - код операции, второй байт – смещение. В коде операции заложена информация о том, что второй байт интерпретируется как смещение. Здесь нужно отметить одну особенность транслятора ассемблера - он является однопроходным, иными словами, машинный код программы получается за один просмотр команд от начала программы до ее окончания. В связи с этим обстоятельством, если безусловный переход должен происходить на адрес до команды JMP, то транслятор может легко вычислить смещение. Если же переход короткий, но на метку после команды JMP, то транслятору нужно подсказать, что он должен сформировать команду безусловного короткого перехода. С этой целью в команде JMP используется модификатор SHORT PTR (полностью - SHORT POINTER или короткий указатель).

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

Косвенный внутрисегментный переход означает, что в команде JMP указывается не сам адрес перехода, а место, где этот адрес записан.

В командах косвенного перехода рекомендуется применять модификатор NEAR, т.к. при косвенном переходе не всегда транслятору удается определить, находится адрес перехода в текущем сегменте кода или нет.

Команда косвенного межсегментного перехода в качестве операнда имеет адрес области памяти, в которой содержится смещение и сегментная часть целевого адреса перехода.

Одним из вариантов рассматриваемого перехода является косвенный регистровый межсегментный переход. Адрес перехода в этом варианте указывается в регистре, что удобно при программировании динамических переходов, когда конкретный адрес перехода определяется в процессе выполнения программы и помещается в регистр.

1.4 Организация циклов

При организации циклов широко используются команды INC (инкремент) и DEC (декремент), что означает добавление или вычитание единицы из целого числа, помещенного в ячейку памяти, РОН или индексный регистр. Команды имеют формат:

INC операнд ,

DEC операнд.

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

Команда означает 'повторить цикл'. Выполнение команды заключается в следующем:

- вычитании 1 из регистра СХ;

- сравнении регистра СХ с нулем;

- если СХ=0, то управление передается на следующую после LOOP команду, иначе осуществляется передача управления на метку перехода.

Другими командами цикла являются команды: LOOPE/LOOPZ метка перехода, которые означают "повторить цикл, пока СХ<>0 или ZF=0". Обе команды совершенно идентичны, поэтому использовать можно любую из них. Отличаются эти команды от предыдущей команды анализом окончания цикла:

-если СХ>0 и ZF=1, управление передается на метку перехода, иначе если СХ=0 или ZF=0, то выполняется следующая после команды LOOPE/LOOPZ команда.

Еще одной модификацией являются команды цикла

LOOPNE/LOOPNZ метка перехода, которые означают, "повторить цикл, пока СХ<>0 или ZF=1". Как и в предыдущем случае обе команды совершенно идентичны. В них анализ окончания цикла выполняется по следующему правилу:

-если СХ>0 и ZF=0, управление передается на метку перехода, иначе если СХ=0 или ZF=1, то выполняется следующая после команды LOOPNE/LOOPNZ операция.

Общая особенность команд цикла в том, что они используют регистр общего назначения СХ как счетчик числа повторений цикла, поэтому при их использовании не забудьте до метки перехода послать в этот регистр нужное число – количество повторений цикла!

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

Команды условного перехода - student2.ru 2 Задание по лабораторной работе

1. По таблице кодов ASCII определить коды заданных для фильтрации символов: 5, 6, 7, 8, 9;

2. Выделить в сегменте данных операционной системы память для входной строки символов (не менее 20 символов) и для строки вывода в которую будут выводиться отфильтрованные символы;

3. Выполнить ввод слова произвольной строки символов, содержащих указывающие символы для фильтровки;

4. Выполнить сравнительный анализ каждого символа введённой строки;

5. На основании анализа сформировать строку вывода;

6. Выполнить вывод строки на экран.

Наши рекомендации