Пособие по AVR. Булева алгебра и логические операции

Пособие по AVR. Булева алгебра и логические операции

Очередная глава пособия по разработке на микроконтроллерах AVR посвящена базовым логическим операциям. Логические операции или операции алгебры логики — повседневный инструмент в двоичном мире, поэтому умение оперировать ими является таким же необходимым, как умение составлять буквы в слова.

Логические операции или операции алгебры логики

В нашем пособии постоянно говорится о четырех базовых операция:

  • логическое И, AND
  • лоигческое ИЛИ, OR
  • логическое НЕ, NOT
  • исключающее ИЛИ, XOR — Exlusiv or

Что же кроется за этими всеми операциями?

Общие сведения

Логические операции применяются к одному регистру и второму операнду. Вторым операндом может быть регистр или константа. Т.к. регистр состоит из 8 бит, то логические операции применяются сразу ко всем восьми битам.

Результат операции над обоими аргументами записывается в регистр первого аргумента (следовательно, первым аргументом обязательно должен быть регистр. — прим. переводчика).

Операторы

Логическое И (AND)

Для начала определим таблицу истинности для логического И.

Логическое И
A B Результат
0 0 0
0 1 0
1 0 0
1 1 1

Результат операции равен единице тогда и только тогда, когда оба операнда равны единице.

Применение (примеры)

  • целенаправленное обнуление нужных битов
  • наложение необходимых битовых масок.

Команды AVR

Пример кода:

      and  r16, r17             ; Для двух регистров
      andi r16, 0b01011010      ; Для регистра и константы

Пусть значение регистра r16 = 0b11001100, тогда результат логического ИЛИ с константой вида andi r16, 0b01011010 будет:

      0b11001100
      0b01011010   И
     -----------
      0b01001000

Результат будет записан в первый операнд (r16).

В результат записываются исходные биты только на тех позициях, где в маске стоит единица. Остальные биты обнуляются. Т.к. в маске

     0b01011010

биты 0, 2, 5, 7 обнулены, то и в результат на этих же позициях записывается 0. Остальные биты «кочуют» из исходного операнда (r16).

Логическое ИЛИ (OR)

Таблица истинности для логического ИЛИ выглядит следующим образом:

Логическое ИЛИ
A B Результат
0 0 0
1 0 1
0 1 1
1 1 1

Результат является истиной только тогда, когда один из операндов А или B или они оба являются истинными (т.е. равны единице).

Применение

  • целенаправленная установка нужных бит в 1 по заданной маске.

Команды AVR

Пример кода:

      or   r16, r17           ; Операция над двумя регистрами
      ori  r16, 0b01011010    ; Операция над регистром и константой

Пусть значение в регистре r16 = 0b11001100, тогда операция логического сложения (ИЛИ) вида ori r16, 0b01011010 даст следующий результат:

      0b11001100
      0b01011010     ИЛИ
     -----------
      0b11011110

Результат будет записан в первый операнд (r16).

На позициях, где в маске (второй операнд) стоят единицы, в результате тоже будут стоять единицы. Остальные биты переносятся из первого операнда.

Т.к. в маске у нас задано число

      0b01011010,

содержащее единицы на позициях 1, 3, 4, 6, то в результате на этих же позициях стоят единицы. Остальные биты берутся из первого операнда r16.

Логическое НЕ

Логическое НЕ, или инверсия, имеет следующую таблицу истинности:

Логическое НЕ
A Результат
0 1
1 0

Результат является истиной тогда и только тогда, когда операнд не является истиной.

Применение

  • инверсия всех бит в байте, т.е. замена всех бит противоположными значениями.

Команда AVR

Пример кода:

      com  r16

Пусть значение регистра r16 = 0b11001100, тогда инверсия этого значения вида com r16 будет выглядеть так:

      0b11001100     НЕ
     -----------
      0b00110011

Результат записывается единственный операнд (r16).

XOR (Exlusives Oder)

Для исключающего ИЛИ (сумма по модулю 2) имеет следующую таблицу истинности

Исключающее ИЛИ
A B Результат
0 0 0
0 1 1
1 0 1
1 1 0

Результат является истиной тогда и только тогда, когда один из операндов является истиной, но не не оба одновременно.

Применение

  • точечная инверсия нужных битов.

Команды AVR

Пример кода:

      eor  r16, r17   ; Исключающее ИЛИ для двух регистров

Допустим значение регистра r16 = 0b11001100, а значение регистра r17 = 0b01011010, тогда результат сложения по модулю 2 для этих операндов вида eor r16, r17 будет следующим:

      0b11001100
      0b01011010     Исключающее ИЛИ (XOR)
     -----------
      0b10010110

Результат будет записан в первый операнд (r16).

В результате будут инвертированы только те биты, на месте которых в маске стоит единица.

Т.к. в маске (r17) у нас число

      0b01011010

с единицами на позициях 1, 3, 4, 6, то именно эти биты из регистра r16 инвертируются и записываются в результат. Остальные биты регистра r16 остаются неизменными.