В предыдущей статье "Микроконтроллеры для начинающих. Часть 19. Арифметические команды" мы кратко познакомились с командами выполняющими привычные всем арифметические действия. Сегодня мы сделаем следующий шаг и познакомимся с командами выполняющими основные логические операции.
Основные логические операции
Основными логическими операциями обычно считают И (AND), ИЛИ (OR), НЕ (NOT) (отрицание). Однако, существует еще одна операция, которая может быть выражена через три вышеупомянутые, но часто включаемая в список основных. Это операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR).
Рассматриваемые сегодня команды логических операций применяются к переменным в целом, то есть, каждому ее биту. Команды, которые позволяют манипулировать отдельными битами переменных мы рассмотрим в следующий раз.
В этой таблице, которую я привел, что бы просто напомнить, как работают основные логические операции, F обозначает ЛОЖЬ (FALSE), а T ИСТИНУ (TRUE). В современных процессорах обычно ИСТИНА соответствует логической 1, а ЛОЖЬ логическому 0.
Логическое отрицание
Или операция NOT. Меняет состояние каждого бита в переменной на противоположное. Эту операцию еще часто называют ИНВЕРСИЕЙ. Однако, мнемоника команды, в большинстве случаев, построена на термине ДОПОЛНЕНИЕ (COMPLEMENT). Это дополнении до 1, а не до 2, как было у операции смены знака. Это единственная операция, из рассматриваемых сегодня, которая требует только одного операнда.
COMF - дополнение байта, то есть, инверсия каждого бита, логическое отрицание, операция NOT в микроконтроллерах PIC. При этом аналогичная операция для рабочего регистра отсутствует.
CPL и CPLW - дополнение байта (16-битного слова, для CPLW), то есть, инверсия каждого бита, логическое отрицание, операция NOT в микроконтроллерах STM8.
COM - дополнение байта, то есть, инверсия каждого бита, логическое отрицание, операция NOT в микроконтроллерах AVR.
Логическое И
Выполняет побитовую логическую операцию И над своими операндами. Эту операция часто используют для маскирования (выделения) отдельных бит переменной. Например, что бы выделить младшую тетраду в байте достаточно выполнить операцию логического И с "маской" 00001111. При этом в результате состояние бит младшей тетрады останется неизменным, а биты старшей тетрады будут сброшены.
ANDWF - логическое И между содержимым рабочего регистра и указанной ячейкой памяти в микроконтроллерах PIC. Если требуется использовать непосредственный операнд, а не рабочий регистр, то нужно использовать команду ANDLW.
AND - логическое И в микроконтроллерах STM8 и AVR. Только в STM8 операция выполняется над содержимым аккумулятора и указанной ячейкой памяти, а в AVR между содержимым двух заданных регистров.
ANDI - логическое И между содержимым заданного регистра и непосредственным операндом в AVR. Пожалуй, стоит отметить, что допустимо указывать только регистры R16-R31.
Логическое ИЛИ
Выполняет побитовую логическую операцию ИЛИ над своими операндами. Эту операция часто используют для выборочной установки отдельных бит переменной (независимо от того, какими эти биты были до операции). Например, что бы установить все биты в 1 в младшей тетраде в байте достаточно выполнить операцию логического ИЛИ с 00001111.
Эту операцию еще иногда называют ВКЛЮЧАЮЩИМ ИЛИ, что бы выделить ее отличие от ИСКЛЮЧАЮЩЕГО ИЛИ.
IORWF - логическое ИЛИ между содержимым рабочего регистра и указанной ячейкой памяти в микроконтроллерах PIC. Если требуется использовать непосредственный операнд, а не рабочий регистр, то нужно использовать команду IORLW
OR - логическое ИЛИ в микроконтроллерах STM8 и AVR. Только в STM8 операция выполняется над содержимым аккумулятора и указанной ячейкой памяти, а в AVR между содержимым двух заданных регистров.
ORI - логическое ИЛИ между содержимым заданного регистра и непосредственным операндом в AVR. Пожалуй, стоит отметить, что допустимо указывать только регистры R16-R31.
ИСКЛЮЧАЮЩЕЕ ИЛИ
Выполняет побитовую операцию ИСКЛЮЧАЮЩЕЕ ИЛИ над своими операндами. Эту операция часто используют для выборочной инверсии отдельных бит переменной. Например, что бы инвертировать все биты в младшей тетраде в байте достаточно выполнить операцию ИСКЛЮЧАЮЩЕЕ ИЛИ с 00001111.
XORWF - ИСКЛЮЧАЮЩЕЕ ИЛИ между содержимым рабочего регистра и указанной ячейкой памяти в микроконтроллерах PIC. Если требуется использовать непосредственный операнд, а не рабочий регистр, то нужно использовать команду XORLW
XOR - ИСКЛЮЧАЮЩЕЕ ИЛИ между содержимым аккумулятора и указанной ячейки памяти в микроконтроллерах STM8.
EOR - ИСКЛЮЧАЮЩЕЕ ИЛИ между содержимым двух указанных регистров в микроконтроллерах AVR. Обратите внимание, что команда EORI отсутствует.
Заключение
Вот такой короткой и простой получилась сегодняшняя статья. Потому что сами команды логических операций просты.
В следующий раз мы познакомимся с командами манипуляции отдельными битами, причем не только в переменных, но и флагов состояния процессора.
До новых встреч!