Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП устройства СУ / Конспект лекций (дополнительный, обновленный).doc
Скачиваний:
127
Добавлен:
19.03.2015
Размер:
552.45 Кб
Скачать

13.9.3. Команды выполнения логических операций.

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

1. Команда АND А,r выполняет операцию поразрядного логического умножения (операцию И, конъюнкцию) содержимого аккумулятора и регистра общего назначения r. Данная команда воздействует на все флаги, а флаги переноса CF и вспомогательного переноса AF в частности сбрасываются обычно в ноль. Поэтому команда AND А,A , например, может быть примена для воздействия на флаги без изменения содержимого аккумулятора, т.к. согласно тождествам алгебры-логики , либо для обнуления флаговCF и AF. Такая потребность может возникнуть, если нужно определить признаки содержимого аккумулятора после команд, на флаги не воздействовавших, например, после выполнения команд ввода-вывода.

2. Команда АND А,M выполняет операцию логической конъюнкции над содержимым аккумулятора и косвенно адресуемой через регистровую пару или регистр-указатель адреса ячейки памяти M. Воздействие команды на флаги аналогично воздействию предыдущей команды.

3. Команда ANDI A,data также выполняет операцию поразрядного логического умножения, но над содержимым аккумулятора и операндом data, заданным в команде. Эта команда имеет непосредственную адресацию. Воздействие команды на флаги аналогично воздействию предыдущей команды. Если необходимо, например, выделить третий разряд в байте, находящемся в аккумуляторе, а остальные его разряды обнулить, то производят операцию поразрядного логического умножения содержимого аккумулятора с маской, в третьем разряде которой должна быть записана 1, а в остальных - 0. Команда будет выглядеть следующим образом: ANDI A,00000100B. Символ «B» в конце операнда-маски указывает на двоичную форму его записи.

4. Команда ОR А,r выполняет операцию поразрядного логического сложения (операцию ИЛИ, дизъюнкцию) содержимого аккумулятора и регистра общего назначения r. Данная команда также воздействует на все флаги, а флаги CF и AF сбрасывает в ноль. Как и в случае с командой AND A,A , команда ОR А,A может быть использована для воздействия на флаги или обнуления флагов CF или AF без изменения содержимого аккумулятора, поскольку .

5. Команда ОR А,M выполняет операцию поразрядной логической дизъюнкции над содержимым аккумулятора и косвенно адресуемой ячейки памяти M. Воздействие команды на флаги аналогично воздействию предыдущей команды.

6. Команда ORI A,data является командой непосредственной адресации и выполняет операцию поразрядной логической дизъюнкции над содержимым аккумулятора и операндом data записанным в команде в виде константы. Воздействие команды на флаги аналогично воздействию предыдущей команды. Если необходимо, например, записать в пятый разряд байта, находящегося в аккумуляторе, единицу, не изменяя при этом значения остальных его разрядов, то нужно произвести операцию поразрядного логического сложения содержимого аккумулятора с маской, в пятом разряде которой будет присутствовать 1, а в остальных - 0. Команда будет выглядеть следующим образом: ORI A,00010000B.

7. Команда XOR A,r выполняет операцию поразрядного логического сложения по модулю 2 (операцию ИСКЛЮЧАЮЩЕЕ ИЛИ) над содержимым аккумулятора и регистра общего назначения r. Воздействие команды на флаги аналогично воздействиям рассмотренных ранее логических команд. Команда XOR A,А , в частности, используется для обнуления аккумулятора и флагов CF и AF, поскольку известно, что .

8. Команда XOR A,M выполняет операцию поразрядного логического сложения по модулю 2 над содержимым аккумулятора и косвенно адресуемой ячейки памяти M. Воздействие команды на флаги аналогично воздействиям в вышеописанных командах.

9. Команда XORI A,data производит операцию поразрядного логического сложения по модулю 2 над содержимым аккумулятора и явно записанным в команде в виде константы операндом data. Воздействие команды на флаги аналогично воздействию в вышеописанных командах. Для того, чтобы изменить на противоположное значение, например, седьмого разряда байта, находящегося в аккумуляторе, при этом не изменяя значения остальных его разрядов, необходимо выполнить операцию поразрядного логического сложения по модулю 2 с маской, в седьмом разряде которой должна быть записана 1, а в остальных - 0. Команда будет выглядеть следующим образом: XORI A,01000000B.

10. Команда СМР A,r позволяет сравнивать два числа, находящихся в аккумуляторе и в регистре r. Сравнение осуществляется вычитанием из содержимого аккумулятора содержимого регистра r. Вычитание производится без сохранения результата в аккумуляторе. Результат вычитания проявляется только в воздействии на флаги. Если операнды равны, флаг нуля ZF устанавливается в единицу. Если значение числа, находящегося в аккумуляторе, меньше значения второго числа, находящегося в регистре r, и оба числа положительны и заданы в прямых кодах, то устанавливается в единицу флаг переноса СF. Если же сравниваются два знаковых числа в дополнительных кодах, то в случае вычитания из меньшего числа большего в единицу установится флаг знака SF. В противных же случаях все эти флаги будут иметь нулевые значения.

11. Команда СМР A,M аналогична предыдущей, но имеет косвенную адресацию данных, т.е. вычитает без сохранения результата из содержимого аккумулятора содержимое косвенно адресуемой через регистровую пару или адресный регистр-указатель ячейку памяти M.

12. Команда CMPI A,data сравнивает путем вычитания содержимое аккумулятора с операндом data, заданным в команде в виде константы. Эта команда имеет непосредственную адресацию данных. В остальном назначение команды аналогично предыдущим двум.

13. Команда СМ А инвертирует содержимое аккумулятора.

14. Команда RLC A выполняет циклический (замкнутый) сдвиг содержимого аккумулятора влево на один разряд через флаг переноса CF. Из описания команды видно, что все разряды сдвигаются влево на одну позицию (ai+1)  (ai); в самый младший разряд записывается ранее установленное значение флага переноса (a0)  (CF); выдвигаемый старший разряд фиксируется во флаге переноса (CF)  (an). Команды сдвига часто используются для организации операций умножения и деления, т.к. сдвиг двоичного кода влево на один разряд равносилен его умножению на 2, а сдвиг вправо на один разряд - делению на 2. Только необходимо помнить, что рассмотренная команда может исказить результат умножения на 2, поскольку она возвращает обратно в младший бит сдвигаемого байта значение флага переноса. Для корректного же умножения на 2 в младшем бите должен быть установлен 0. Для этого можно перед началом сдвига обнулить флаг переноса, например, командой AND A,A или иной специальной, если такая имеется в системе команд микропроцессора. Так же можно воспользоваться командой арифметического сдвига содержимого аккумулятора влево, которая будет рассмотрена дальше.

15. Команда RRC A выполняет циклический (замкнутый) сдвиг содержимого аккумулятора вправо на один разряд через флаг переноса CF по схеме, аналогичной описанной в предыдущей команде. Путем использования команды RRC A можно определить, например, среднее арифметическое двух значений. Для этого нужно на первом этапе выполнить сложение двух значений, среднее арифметическое которых необходимо определить, используя для этого команду ADD A,r , например. В результате сложения может либо возникнуть перенос, либо не возникнуть, который зафикисируется во флаге переноса единичным или нулевым значением. Поэтому для корректного деления пополам полученной суммы, при сдвиге вправо необходимо учесть этот факт. Это и сделает команда RRC A , вернув значение флага переноса в самый старший разряд результата.

16. Команда RAL A выполняет циклический (замкнутый) сдвиг содержимого аккумулятора влево на один разряд. При этом старший бит замыкается на младший (a0)  (an) и он же выдвигается во флаг переноса (CF)  (an).

17. Команда RAR A выполняет циклический (замкнутый) сдвиг содержимого аккумулятора вправо на один разряд по схеме, аналогичной описанной в предыдущей команде, но в обратном направлении.

18. Команда SAL A является командой арифметического сдвига влево, или, как его еще называют, разомкнутого или простого. Отличие этой команды от предыдущих команд циклического сдвига влево заключается в том, что в младший бит при каждом сдвиге записывается ноль (a0)  0. Старший бит как и в предыдущих командах сдвига влево выдвигается во флаг переноса. Именно этой командой можно выполнить умножение аккумулятора на 2 без каких либо дополнительных манипуляций над флагом переноса CF.

19. Команда SAR A выполняет разомкнутый арифметический сдвиг вправо, но по несколько иной схеме, нежели команда арифметического сдвига влево. Отличие заключается в том, что самый старший разряд при сдвиге не меняет своего значения (an)  (an), т.е. сдвигаются все разряды вправо, кроме старшего. Сохранение значения самого старшего разряда позволяет корректно реализовывать арифметические операции умножения и деления над знаковыми числами в дополнительных кодах.

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