Тема 2.5 Команды передачи управления
Тема 2. 5 Команды передачи управления 1. Общие сведения 2. Команды условного перехода 3. Команда безусловного перехода 4. Процедуры 5. Организация циклов
1. Общие сведения Эти команды реализуют изменение естественного порядка выполнения команд программы. Их можно разделить на 3 подгруппы, описание которых сведено в таблицу 4.
В приведенной таблице через слеш ‘/’ перечисляются идентичные команды, действие которых совершенно одинаково и применение конкретной из них зависит от пристрастий программиста. Наличие идентичных команд объясняется тем фактом, что если число_1 > число_2, то можно с уверенностью утверждать, что число_1 не (меньше или равно) число_2. 1. Команды условного перехода Обратимся теперь к командам условного перехода. В их мнемонические обозначения входят буквы, которые определяют условия в соответствии с нижеприведенной таблицей:
Операнд “метка перехода” или “близкая метка” отражает тот факт, что метка помеченной команды должна находиться в пределах текущего сегмента кода и на относительном расстоянии от команды перехода > -128 и < 127 байтов. Ограничение –128: 127 байтов снято у процессоров, начиная с модели 80386, однако ограничение передачи управления в пределах текущего сегментного кода действует и в моделях Пентиум. Решение о том, куда будет передано управление командой условного перехода, принимается на основании условия. Источниками таких условий могут быть: - любая команда, изменяющая состояние арифметических флагов (ниже эти флаги будут перечислены); - команда сравнения CMP. В последних публикациях по программированию на Ассемблере среди команд передачи управления рассматривают команду сравнения CMP, хотя эта команда ближе к арифметическим операциям. Объясняется это тем, что, как правило, команды безусловного перехода в программах следуют за командой сравнения, ибо именно сравнение лежит в основе решения (символа процесса). Формат команды CMP: CMP приемник, источник или CMP операнд1, операнд2 Эта команда осуществляет по сути вычитание операнд_1 - операнд_2 или приемник – источник, однако результат никуда не записывает, а только устанавливает флаги в соответствие с нижеприведенной таблицей.
В этой таблице приняты следующие обозначения: - “H” означает, что ‘не имеет значения” или иначе, на этот флаг операция не влияет; - 0/1 означает, что флаг устанавливается или в 1 или в 0 в зависимости от значений операндов (отрицательные или положительные или разнознаковые операнды сравниваются). Приведем еще одну таблицу, в которой отражается действие команд условного перехода по значениям анализируемых этими командами флагов:
В приведенной таблице по сути присутствуют 3 группы команд условного перехода, которые названы “любые”, “без знака” и “со знаком”. Беззнаковое число подразумевает, что все его биты – биты данных. Типичные примеры таких чисел – порядковые номера элементов в списке, коды символов, телефонные номера и т. п. Знаковые числа подразумевают, что старший разряд (первый слева) соответствует знаку (значение бита 0 соответствует знаку ‘+’, а значение 1 – знаку ‘-‘. Предположим, CL содержит 11000110, а DL –00101100. Команда CMP CL, DL сравнивает содержимое регистров. Если интерпретировать содержимое регистров как беззнаковые числа, то значение в CL больше, а если в регистрах числа со знаком, то DL больше, поскольку как число со знаком значение в CL является отрицательным. Приведу примеры использования команд условного перехода. Положим, значения длин сторон треугольника обозначены a, b и c и занесены в байтовые переменные с такими же именами. Положим, что в программе осуществляется проверка значений сторон треугольника на предмет его идентификации: является ли треугольник со сторонами a, b и c равносторонним, равнобедренным или общего типа. Заметим, что стороны треугольника всегда принимают положительные значения, поэтому в программе нужно применять условные команды группы “без знака. Приведу фрагмент схемы программы и соответствующие команды на языке ассемблера. Узлом и меткой К обозначены команды завершения программы. Поскольку пока мы не изучили команд прерывания для выдачи сообщений на экран дисплея, в приведенном фрагменте программы такие команды отсутствуют, но отмечены места, где они должны быть вставлены.
MOV AL, A MOV BL, B MOV СL, С CMP AL, BL
ДА CMP BL, CL JNE NOT_EQABC . . . . . . . . . . . . . . . . здесь поместить команды выдачи сообщения НЕТ “треугольник равносторонний”
; на метку K NOT_EQABC: CMP AL, BL JE EQUAL
JE EQUAL НЕТ CMP AL, CL
да здесь поместить команды выдачи сообщения
JMP K ; переход к К EQUAL: . . . . . . . . . . . . . . . . . . .. .
выдачи сообщения “треугольник равнобедренный” К: RET
Рисунок 1. Фрагмент программы идентификации треугольника
Обратите внимание! Команды сравнения и условного перехода, набранные в приведенном выше фрагменте программы курсивом, реализуют функцию логического И, а команды, набранные обычным шрифтом, реализуют функцию логического ИЛИ. В следующей таблице приводятся специальные инструкции условного перехода.
Примером применения логических команд и команд условного перехода может быть следующий фрагмент программы: OR DX, DX ; проверить значение в регистре
JZ M1 ; если DX=0, перейти на метку М1 JS M2 ; если DX< 0, перейти на меткуМ2 TEST DX, 00000001B; проверить младший бит JZ CHET ; если бит нулевой, число в DX четное NECHET: . . . . . .; если бит ненулевой, число в DX нечетное . . . . . Здесь предусмотреть обработку нечетного значения. Следует отметить, что в этом фрагменте на чет-нечет будут проверяться не все возможные значения, а только значения из определенного диапазона. Подумайте и ответьте: какой это диапазон?
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|