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

АЛУ принимает два 8-битных операнда (обозначим их как A и X) и поддерживает пять ключевых функций: сложение, логическое И, ИЛИ, исключающее ИЛИ и циклический сдвиг вправо. При инвертировании входа X устройство также успешно выполняет вычитание и побитовое дополнение. Примечательно, что отдельной операции сдвига влево не предусмотрено — она заменяется сложением числа с самим собой. Стоит также отметить простоту арифметического блока 8085: встроенные аппаратные средства для умножения и деления в этой архитектуре отсутствуют — они появились лишь в 8086.
Конструктивно АЛУ состоит из 8 идентичных секций, каждая из которых обслуживает один бит. При выполнении сложения этот блок работает как В основании схемы расположен узел «Negation», который определяет, следует ли инвертировать второй операнд (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 — инвертирует его, что позволяет гибко управлять результатом в зависимости от текущей инструкции. Операция Промежуточный результат Перенос Итог 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) Complement A NOR /X 1 A OR /X Subtract A NXOR /X /перенос A XOR /X XOR CARRY Система формирования переноса динамически адаптируется: в зависимости от типа операции она либо жестко задает значение 0 или 1, либо транслирует инвертированный перенос из предыдущего разряда. Флаг четности вычисляется через цепочку XOR-вентилей, охватывающих все биты результата. Флаг нуля реализован еще изящнее: он представляет собой 8-входовой элемент NOR, распределенный по всему АЛУ, который активируется, если хотя бы один бит результата отличен от нуля. Работа всех узлов АЛУ синхронизируется набором управляющих линий, состояние которых определяется программируемой логической матрицей (PLA). Всего поддерживается 7 основных сценариев обработки данных. Функция select_neg select_op1 select_op2 shift_right force_ncarry_1 Коды операций OR 0 0 0 0 1 ORA, ORI ADD 0 1 0 0 0 ADD, ADC, INR, DCR и др. XOR 0 1 0 0 1 XRA, XRI AND 0 1 1 0 1 ANA, ANI Shift Right 0 0 1 1 1 RRC, RAR Complement 1 0 0 0 1 CMA Subtract 1 1 0 0 0 SUB, SBB, CMP и др. В основе анализа лежат данные проекта visual6502. Используя высокоточные микрофотографии кристалла, команда создала транзисторную модель процессора. Я преобразовал эту модель в логические вентили, что позволило «оживить» схему, проследить прохождение сигналов и составить полную карту работы АЛУ. АЛУ процессора 8085 — это шедевр минимализма и функциональности того времени. В отличие от 6502, где используется мультиплексирование параллельно вычисленных значений, АЛУ 8085 работает как высокоспециализированная машина, формирующая именно тот результат, который требует текущая микрокоманда. Невидимая оборона 386: как защищены входы и выходы процессора Как сделать реверс-инжиниринг аналоговой микросхемы: FM-радиоприёмник TDA7000 Схемотехника стека сопроцессора Intel 8087 для чисел с плавающей запятой: реверс-инжиниринг Два бита на транзистор: ПЗУ микрокода повышенной плотности в FPU-сопроцессоре Intel 8087 Анализ кристалла 8087: быстрый битовый шифтер математического сопроцессора Внутри Intel 1405: фото кристалла памяти на регистре сдвига (1970) Реверс-инжиниринг АЛУ процессора 8086 по фотографиям кристалла Для тех, кто хочет глубже погрузиться в архитектуру современных систем, предлагаем ознакомиться с актуальными обучающими материалами: 23 апреля в 20:00. «Многопоточность в C++: как писать быстрые и безопасные приложения». Записаться 4 мая в 20:00. «Интерфейсы в Golang изнутри». Записаться 19 мая в 20:00. «Асинхронность под капотом». Записаться Полный перечень бесплатных вебинаров доступен в календаре мероприятий.
Модуль инверсии
Логическая обработка
Интеграция с переносом
Флаги состояния
Управляющая логика
Методология реверс-инжиниринга
Итоги
Другие выпуски от Ken Shirrif



