КАТЕГОРИИ: Архитектура-(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
Подобно командам 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; Просмотров: 2142; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |