Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП по циклу ЛР ОМПТ.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.81 Mб
Скачать

Команды сравнения

Программисту часто бывает необходимо организовать сравнение двух чисел, для того чтобы по результату этого сравнения выбрать один из возможных путей продолжения программы. Такое сравнение однобайтных чисел реализуется посредством оценки разности сравниваемых чисел. Командами сравнения CMP r, CMP M и CPI d8 организуется обычное однобайтное арифметическое вычитание (как в командах SUB r, SUB M и SUI d8), устанавливающее все биты признаков. Но в отличие от команд вычитания команды сравнения не сохраняют в аккумуляторе сам результат вычитания, поскольку целью сравнения является показ признаков вычитания. Имея состояния битов переноса CY и нулевого результата Z, и применяя команды условных ветвлений в программе, умеющих оценивать состояния признаков и выбирать пути продолжения программы, программист может воспользоваться результатами сравнения.

Три варианта команд сравнения различаются способом адресации операнда уменьшаемого. Команда CMP r адресует уменьшаемое в регистре r; команда CMP M адресует уменьшаемое в ячейке памяти M, адрес которой будет взят из регистровой пары HL; команда CPI d8 адресует уменьшаемое прямым определением его через байт d8 в составе команды.

Пример 1.45

По условиям алгоритма требуется обеспечить переход к метке M1, если байты в регистрах E и C равны, и переход к метке M2, в противном случае.

Метка Мнемокод Комментарий

MOV A,E ; подготовить в A 1-й байт для сравнения из E

CMP C ; выполнить вычитание F(CY,Z)(A)–(C)

JZ M1 ; перейти к M1, если числа равны (Z=1)

JMP M2 ; иначе перейти к M2

……………………………..

M1:

……………………………..

M2:

……………………………..

Пример 1.46

Требуется сравнить число в регистре D с числом 36h и записать большее в аккумулятор.

Метка Мнемокод Комментарий

MOV A,D ; подготовить в A 1-й байт для сравнения из D

CPI 36h ; выполнить вычитание F(CY,Z)(A)–36h

JC M1 ; к M1, если в результате операции потребовался

;заём, то есть он – отрицательный: (A)<36h

HLT ; иначе, когда останов (A)≥36h

M1: MVI A,36h ; записать 36h в A

HLT ; останов

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

Команды сдвига

Команды выполняют сдвиг содержимого аккумулятора на один разряд в указанном кодом команды направлении. Арифметически сдвиг двоичного числа влево даёт его удвоение, а сдвиг двоичного числа вправо приводит к уменьшению числа в два раза. Вместе с битами аккумулятора в этих операциях участвует бит CY регистра признаков. Причём, возможны два варианта участия бита CY в операциях сдвига. Схемы выполнения команд сдвигов приведены на рис. 1.2.

Рис.1.2. Выполнение операций сдвига

Команды сдвига влево RAL и RLC обеспечивают одновременное перемещение всех битов числа на один разряд влево: всякий бит с номером m устанавливается равным биту с номером m+1. Различия этих команд связаны с поведением бита CY при сдвиге. В команде RLC выполняется обычный сдвиг влево, при котором содержимое старшего бита уходит в бит CY, а прежнее состояние бита CY теряется. Получается, что команда RLC выполняет сдвиг без учёта предшествующего сдвигу состояния бита CY. В команде RAL бит CY становится как бы девятым битом сдвигаемого байта и его прежнее состояние не теряется, а сдвигается в бит D0. Получается, что команда RAL выполняет сдвиг с учётом состояния бита CY, предшествующего сдвигу. На этой основе можно организовывать сдвиги многобайтных чисел.

Команды сдвига вправо RAR и RRC обеспечивают одновременное перемещение всех битов числа на один разряд вправо: всякий бит с номером m устанавливается равным биту с номером m–1. Различия этих команд связаны с поведением бита CY при сдвиге. В команде RRC выполняется обычный сдвиг вправо, при котором содержимое младшего бита уходит в бит CY, а прежнее состояние бита CY теряется. Получается, что команда RRC выполняет сдвиг без учёта предшествующего сдвигу состояния бита CY. В команде RAR бит CY становится как бы девятым битом сдвигаемого байта и его прежнее состояние не теряется, а сдвигается в бит D7. Получается, что команда RAR выполняет сдвиг с учётом состояния бита CY, предшествующего сдвигу.

Пример 1.47

Требуется уменьшить в 2 раза двухбайтное число, хранящееся в регистровой паре HL.

Метка Мнемокод Комментарий

ANA A ; сброс бита CY

MOV A,H ; загружаем для сдвига старший байт

RAR ; выполняем сдвиг вправо или деление на 2

MOV H,A ; сохраняем старший байт результата

MOV A,L ; загружаем для сдвига младший байт

RAR ; сдвиг вправо с учётом переноса от

;предыдущего сдвига

MOV L,A ; сохраняем младший байт результата

В результате этих операций в регистровой паре HL окажется число вдвое меньше исходного.