Команды логических операций
Команды логических операций обеспечивают логические операции над соответствующими (имеющими одинаковый номер) битами однобайтных операндов. Влияния битов друг на друга типа переноса или заёма, имевшие место при арифметических операциях, в логических операциях отсутствуют. Поэтому, за счёт влияния логических команд на все биты признаков, биты CY и AC после этих команд всегда будут сброшены в 0.
Основные логические команды обеспечивают логические операции & – “И” (конъюнкция), Ú – “ИЛИ” (дизъюнкция), Å – “исключающее ИЛИ” (сложение по модулю два) в соответствии с правилами логики (Табл.10). Эти команды выполняются по общей схеме арифметическо-логических команд: первый операнд и результат операции всегда хранятся в аккумуляторе, а второй операнд может быть выбран модификациями команд: либо в любом из регистров процессора; либо в ячейке памяти M, хранящей адрес в HL; либо непосредственно в составе самой команды.
Таблица 1.10.
Результаты логических операций
Исходные числа | & | Ú | Å | |
Команда CMA обеспечивает логическую операцию “НЕ” над операндом из аккумулятора. Выполняется инвертирование всех битов и результат остаётся в аккумуляторе. Если например, до выполнения команды в аккумуляторе было число 10110101, то после команды CMA там будет число 01001010.
Команды типа ANA r, ORA r, XRA r обеспечивают операции “И”, “ИЛИ”, “исключающее ИЛИ” соответственно, притом, что второй операнд адресуется регистровым способом через выбор регистра r из регистров A, B, C, D, E, H, L.
Команды типа ANA M, ORA M, XRA M обеспечивают операции “И”, “ИЛИ”, “исключающее ИЛИ” соответственно, притом, что второй операнд адресуется косвенно-регистровым способом через адрес подготовленный предварительно в регистровой паре HL.
Команды типа ANI d8, ORI d8, XRI d8 обеспечивают операции “И”, “ИЛИ”, “исключающее ИЛИ” соответственно, притом, что второй операнд адресуется прямым способом то есть является вторым байтом d8 в составе самой команды.
Команды операций “И” используется когда требуется, например, оценить состояние какого-то одного из битов в составе байта.
Пример1.42
Требуется оценить значение бита D4 в составе байта из регистра B.
Адрес Число Мнемокод Комментарий
0800 78 MOV A,B ; поместить в A исследуемый байт
0801 E6 10 ANI 10h ; выполнить операцию (A)(A)&00010000b
если бит Z в регистре признаков покажет наличие нулевого результата, то значит исследуемый бит равен нулю, иначе он равен единице.
Команда операции “И” может также быть применена для сброса в ноль какого-то одного или нескольких битов в составе байта.
Пример1.43
Требуется сбросить в ноль бит D6 в составе байта из регистра B..
Адрес Число Мнемокод Комментарий
0800 78 MOV A,B ; поместить в A исследуемый байт
0801 E6 BF ANI BFh ; выполнить операцию (A)(A)&10111111b
Команды операций “ИЛИ” уместно применить в случае необходимости установить в единицу один из битов в составе байта.
Пример1.44
Требуется установить в единицу бит D2 в составе байта из регистра B.
Адрес Число Мнемокод Комментарий
0800 78 MOV A,B ; поместить в A исследуемый байт
0801 F6 02 ORI 02h ; выполнить операцию (A)(A)Ú00000010b
Команда XRA A эффективна для очистки аккумулятора, так как занимает в памяти только один байт и выполняется всего за 4 такта.
Команды сравнения
Программисту часто бывает необходимо организовать сравнение двух чисел, для того чтобы по результату этого сравнения выбрать один из возможных путей продолжения программы. Такое сравнение однобайтных чисел реализуется посредством оценки разности сравниваемых чисел. Командами сравнения 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 окажется число вдвое меньше исходного.