Арифметико-логическое устройство (АЛУ) является «сердцем» любого вычислителя, отвечая за выполнение базовых математических и логических операций. Тем не менее, его внутренняя архитектура для многих остается загадкой. В этой статье я представлю результаты реверс-инжиниринга схемы АЛУ микропроцессора 8085. На первый взгляд устройство кажется хаотичным нагромождением логических вентилей, однако при детальном погружении в булеву алгебру его структура становится вполне логичной и стройной.
На диаграмме ниже отмечено положение АЛУ в составе 8085. Мы имеем дело с 8-битной архитектурой, где старший разряд расположен слева. Непосредственно под АЛУ размещен блок регистров, состоящий из 16-битных пар 8-битных регистров. Примечательно, что порядок разрядов в регистровом файле инвертирован по отношению к АЛУ: старший разряд здесь находится справа.

АЛУ оперирует двумя 8-битными входами (A и X), поддерживая пять ключевых операций: ADD, OR, XOR, AND и SHIFT-RIGHT. Благодаря возможности инвертирования входа X, устройство также справляется с вычитанием и взятием дополнения. Отсутствие аппаратного сдвига влево (SHIFT-LEFT) компенсируется простым сложением числа с самим собой. Стоит отметить, что арифметический инструментарий 8085 весьма аскетичен: здесь нет встроенных команд умножения или деления — они появились лишь в архитектуре 8086.
Конструктивно АЛУ разбито на 8 идентичных секций, каждая из которых обслуживает один бит. В режиме сложения эти секции формируют В нижней части секции расположен узел «Negation», управляющий инверсией второго аргумента. Он позволяет выбирать между прямой (XN) и инвертированной (/XN) версией входного сигнала. Над блоком инверсии находится логический узел «Operation». Используя элементы NAND и OR, управляемые линиями select_op1 и select_op2, схема формирует комбинации, которые после дальнейшей обработки дают нужный результат: select_op1 select_op2 Логический результат 0 0 A NOR X 0 1 0 1 0 A NXOR X 1 1 A AND X Заметим, что некоторые операции на этом этапе выдаются в инвертированном виде, что корректируется на последующих стадиях. Узел «Combine with carry» — это финальный этап формирования выходного сигнала, где результат операции объединяется с битом переноса через XOR. Этот блок фактически работает как XOR-гейт: если перенос равен 0, значение не меняется; если 1 — инвертируется. Матрица состояний переноса обеспечивает правильность вычислений для всех режимов: Операция Выход блока Op Перенос Итог OR A NOR X 1 A OR X ADD A NXOR X /перенос A XOR X XOR CARRY XOR A NXOR X 1 A XOR X AND A AND X 0 A AND X SHIFT RIGHT 0 0 A(N+1) Флаг чётности (Parity) рассчитывается последовательным применением XOR ко всем битам результата, в то время как флаг нуля (Zero) реализуется как 8-входовой элемент NOR, стягивающий линию к земле при наличии хотя бы одной «единицы» в выходном байте. Управление АЛУ осуществляется программируемой логической матрицей (PLA), которая на основе декодированного опкода активирует нужные управляющие линии. Эта система делает АЛУ 8085 компактным, но гибким вычислительным узлом. Реверс-инжиниринг показал, что АЛУ 8085 обладает уникальной, высокоэффективной структурой, отличной от подхода, использованного в более поздних или параллельных архитектурах, таких как MOS 6502. Вместо использования универсальных мультиплексоров для выбора из набора готовых результатов, АЛУ 8085 динамически синтезирует именно то значение, которое необходимо для текущей инструкции. Если вас интересуют современные подходы к проектированию систем и архитектурный анализ, предлагаем ознакомиться с актуальными бесплатными занятиями: 23 апреля, 20:00. «Многопоточность в C++». Записаться 4 мая, 20:00. «Интерфейсы в Golang». Записаться 19 мая, 20:00. «Асинхронность под капотом». Записаться Больше бесплатных уроков доступно в календаре событий.
Модуль инверсии
Выполнение операций
Интеграция с переносом

Формирование флагов и управление
Итоги
Другие выпуски от Ken Shirrif



