Арифметико-логическое устройство
Арифметико-логическое устройство (АЛУ) процессора используется для выполнения всех математических операций в программе. Эти операции включают сложение, вычитание, логическое И, логическое ИЛИ, сдвиг содержимого регистров и установку содержимого регистра состояния в соответствии с полученными результатами. АЛУ не используется при чтении или записи данных или команд, оно служит только для обработки данных.
АЛУ можно представить как аппаратный блок, который обрабатывает два слова данных (операнды) и сохраняет полученный результат (рис. 2.17). Как вводятся операнды в АЛУ и куда поступает результат - зависит от конкретного типа микроконтроллера. В этом состоит одно из основных различий между разными типами процессоров и их системами команд. Некоторые микроконтроллеры выбирают один операнд из регистра-аккумулятора и сохраняют результат также в аккумуляторе. Другие микроконтроллеры позволяют использовать различные источники операндов и места размещения результатов.
Рис. 2.17 - Структура АЛУ
АЛУ обычно работают только с положительными целыми числами. Однако при выполнении вычитания получаются отрицательные числа, если вычитаемое больше уменьшаемого. Для представления отрицательных чисел используется дополнительный код («дополнение до двух»). Это необходимо учитывать при знакомстве с работой АЛУ.
Рассмотрим, как выполняется команда вычитания на примере микроконтроллера Microchip PIC. Вместо вычитания одного числа из другого, происходит добавление отрицательного числа:
А - В = А + (-В).
где отрицательное число -В представляется в дополнительном коде. Чтобы получить дополнительный код отрицательного двоичного числа, необходимо инвертировать значение каждого бита, а затем прибавить единицу:
Если есть схема преобразования отрицательных чисел в дополнительный код, то нет необходимости использовать схему вычитания. Достаточно иметь в составе АЛУ сумматор, который реализует вычитание с помощью следующей замены:
.
Этот метод выполнения вычитания может вызвать некоторые затруднения при анализе полученного результата, если учитывать флаг переноса, устанавливаемый в результате сложения и вычитания.
В «классических» АЛУ, которые имеют сумматор и вычитатель, часто используется общий флаг «переноса-заема». Этот флаг устанавливается в 1, когда результат сложения больше, чем 00FFh или результат вычитания меньше нуля. В обоих случаях флаг используется для указания того, что значение 8-и старших бит результата зависят от результата, полученного при операции над 8-ю младшими битами.
Если АЛУ не содержит вычитателя (как и приведенном выше примере), то флаг переноса также устанавливается после сложения или вычитания, но он имеет другое значение. Чтобы понять это, рассмотрим пару примеров. Первый пример показывает, что происходит, когда одно число вычитается из другого числа, которое больше первого:
0077h – 0055h = 0077h + (-0055h) = 0077h + 00AAh + 1 = 0122h
Результат получился больше, чем 00FF, что приводит к установке флага переноса I в младшем бите старшего байта (флаг переноса/заема в этом случае не равен 1). Младшие восемь бит равны 22h (что и ожидалось) - это значение будет записано в качестве результата в приемник
Следующий пример иллюстрирует ситуацию, когда большее число вычитается из меньшего числа:
0055h – 0077h = 0055h + (-0077h) = 0055h + 0088h + 1 = 00DEh
В этом примере младшие 8 разрядов представляют число 22 в дополнительном коде (что и ожидалось), а бит переноса в старший байт (флаг переноса) равен 0. такой как ожидалось. В «классическом» АЛУ для данного примера результат также будет иметь значение 00DEh , но установится флаг заема-переноса равный 1.
Нетрудно заметить, что в АЛУ, не использующем вычитатель. флаг переноса устанавливается в 1, когда результат вычитания положительный, и сбрасывается в 0. когда результат отрицательный. Поэтому формируемый бит переноса в старший байт в этом случае можно было бы назвать флагом «перенос-знак», так как при вычитании он указывает знак результата.
Необходимо иметь в виду, что различные представители одного семейства микроконтроллеров обычно имеют одинаковые АЛУ. В некоторых семействах АЛУ реализуют определенные операции, например, умножение, которые не выполняются микроконтроллерами других семейств. Дополнительные функции, которые обеспечивают различные микроконтроллеры одного семейства, реализуются путем включения в их структуру дополнительных аппаратных средств, аналогично периферийным устройствам. При этом структура и функции АЛУ сохраняются, так как вводимые в микроконтроллер дополнительные устройства используют свои регистры, которые не связаны с регистром состояния и аккумуляторами. Наглядным примером этого является семейство 8-разрядных микроконтроллеров 68НС05, выпускаемых фирмой Motorola.
Сложность АЛУ во многом определяет сложность всего микроконтроллера в целом. Часто над созданием АЛУ работает группа разработчиков, сравнимая по составу с той, которая работает над остальной частью микропроцессора или микроконтроллера (и даже большая, когда разрабатывается процессор аналогичный по сложности персональному компьютеру). От того, как работает АЛУ, зависит функционирование процессора, входящего в состав микроконтроллера, а значит и функционирование всего микроконтроллера.