Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Команды сравнения СМР и TEST

Команды СМР и TEST используются для сравнения двух операндов. Операндами могут быть как регистры, так и адреса памяти, размер операнда — 8, 16 или 32 бита.

СМР o1, о2

Команда СМР — это сокращение от «compare», «сравнить». Она работает подобно SUB: операнд о2 вычитается из o1. Результат нигде не сохраняется, команда просто изменяет регистр признаков. Команда СМР может использоваться как для сравнения целых беззнаковых чисел, так и для сравнения чисел со знаком.

Команда TEST работает подобно СМР, но вместо вычитания она вычисляет поразрядное И операндов. Результат инструкции — измененные флаги регистра признаков. Мы можем использовать TEST для проверки значений отдельных битов в массиве битов.

Примеры использования этих команд:

сmр ах,4 ; сравниваем АХ со значением 4

сmр dl,ah ; сравниваем DL с АН

сmр [diameterl],ах ; сравниваем переменную "diameter1" с АХ

cmp ax,[diameterl] ; сравниваем АХ с переменной "diameterl"

cmp еах,есх ; сравниваем регистры ЕАХ и ЕСХ

test ax,00000100b ; проверяем значение второго (третьего справа) бита

Другой способ изменения последовательности выполнения команд заключается в использовании команды условного перехода. В языке ассемблера имеется множество команд условного перехода. Имена этих команд различаются в зависимости от условия перехода.

Условие состоит из значений одного или нескольких флагов в регистре признаков. Работают эти команды одинаково: если условие истинно, выполняется переход на указанную метку, если нет, то процессор продолжит выполнять программу со следующей команды.

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

Jx метка_назначения

Рассмотрим наиболее часто встречающиеся команды:

jz loop_1 ; переходит к loop_1, если флаг ZF = 1

jc loop_2 ; переходит к loop_2, если флаг CF = 1

js loop_3 ; переходит к loop_3, если флаг SF = 1

jo loop_4 ; переходит к loop_4, если флаг переполнения OF= 1

Любое условие может быть инвертировано, например:

jnz is_true ; переходит к is_true, если флаг ZF = 0

Так же образованы имена команд JNC, JNS и JNO. Чтобы лучше запомнить имена команд, нужно запомнить несколько английских слов: equal — равно, above — больше, below — ниже, zero — ноль, greater — больше, less — меньше.

Таким образом, JE — Jump if Equal (Переход, если Равно), JNE — Jump if Not Equal (Переход, если Не Равно), JA — Jump if Above (Переход, если больше) и т.д.

В таблице 10.1 сведены команды условного перехода в зависимости от условия, которое проверяет процессор (вместо «для перехода» использовано сокращение jump).

Табл. 8.1



  о1==о2 о1=о2 о1!=о2 о1< >о2 о1>о2 о1<о2 о1=<о2 о1>=о2
Инструкции для беззнаковых чисел JE (JZ) JNE (JNZ) JA (JNBE) JB (JNAE) JNA (JBE) JNB (JAE)
Jump, если равно   Jump, если 0 Jump, если не равно   Jump, если не 0 Jump, если больше   Jump, если не меньше или равно Jump, если меньше   Jump, если не больше или равно Jump, если не больше   Jump, если меньше или равно Jump, если не меньше   Jump, если больше или равно
Инструкции для чисел со знаком JE (JZ) JNE (JNZ) JG (JNLE) JL (JNGE) JNG (JLE) JNL (JGE)
Jump, если равно   Jump, если 0 Jump, если не равно   Jump, если не 0 Jump, если больше   Jump, если не меньше или равно Jump, если меньше   Jump, если не больше или равно Jump, если не больше   Jump, если меньше или равно Jump, если не меньше   Jump, если больше или равно

Подобно командам MUL и DIV, для работы с числами со знаком служит другой набор команд условного перехода. Причина этого в том, что проверяемое условие состоит из значений других флагов.

Адрес назначения команды условного перехода должен лежать в пределах 128 байтов: все они реализуют переходы короткого типа. Если вам необходим «переход» за пределы 128 байтов, то нужно в инструкции условного перехода указать метку, по которой будет находиться команда jmp, которая и выполнит дальнейший переход.

Пример 1. Пусть необходимо перейти к метке m3, если регистр АХ содержит значение 3. Прежде всего мы должны проверить, есть ли в регистре АХ тройка. Для этого используем команду СМР. Для проверки равенства применим команду JZ, как показано в таблице команд условного перехода.

сmр ах,3 ; сравниваем АХ с 3

jz m3 ; переходим к "m3", если АХ = 3

Если АХ = 3, то команда jz выполнит переход к метке m3, в противном случае будет продолжено выполнение программы со следующей за jz команды.

Пример 2. Пусть необходимо записать на Ассемблере следующую конструкцию языка С:

if (al==cl) bl=1 else if (al>cl) bl=2 else bl=3;

Вариант 1:

cmp al,cl ; сравниваем AL и CL

jz m1 ; переходим к m1, если AL = CL

cmp al,cl ; сравниваем AL и CL

ja m2 ; переходим к m2, если AL > CL

mov bl,3 ; последний случай — сразу загружаем 3 в BL

end_if: ; просто метка, символизирующая конец IF

jmp . . . .

 

m1: ; метка m1

mov bl,1 ; BL = 1

jmp end_if ; переходим к end_if

m2: ; метка m2

mov bl,2 ; BL = 2

jmp end_if ; переходим к end_if

Вариант 2:

Улучшенный фрагмент кода:

mov bl,1 ; сразу устанавливаем BL = 1

cmp al,cl ; сравниваем AL и CL

je end_if ; переходим в конец программы, если AL = CL

mov bl,2 ; BL = 2

cmp al,cl ; сравниваем AL и CL

ja end_if ; переходим в конец программы, если AL > CL

mov bl,3 ; BL = 3

end_if ; конец программы

Новый пример короче, но нет предела совершенству, и мы можем его еще улучшить. Инструкция MOV не изменяет регистр флагов, поэтому во втором сравнении нет надобности.

8.2. Управляющие конструкции цикла

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

• цикл со счетчиком (цикл FOR), повторяющийся заранее заданное количество раз;

• цикл с условием (цикл WHILE), повторяющийся до тех пор, пока условие истинно;

• цикл с инверсным условием (цикл UNTIL), повторяющийся до тех пор, пока условие не станет истинным.





Дата добавления: 2014-12-07; Просмотров: 933; Нарушение авторских прав?;


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



ПОИСК ПО САЙТУ:


Читайте также:



studopedia.su - Студопедия (2013 - 2017) год. Не является автором материалов, а предоставляет студентам возможность бесплатного обучения и использования! Последнее добавление ‚аш ip: 54.80.54.2
Генерация страницы за: 0.087 сек.