ALU - (Arithmetical-Logical Unit) - это место где происходят все вычисления в процессоре.
ALU как черный ящик имеет следующий интерфейс: Входы: Bus A - операнд 1 Bus B - операнд 2 FlagsIn - некоторые флаги нужные для операций (CF) Control - управляющие линии для выбора операций. (команда) Выходы: Bus C - результат Flags - флаги получившиеся в результате выполнения команды +--------+ | | A ------- >| | | |-------- > C (Result) B ------- >| | | | FlagsIn --- >| |-------- > Flags +--------+ ^ | Control
Блок-схема ALU
ALU состоит из следующих блоков: o Сумматор/Вычитатель используются для сложения/вычитания чисел и для изменения знака числа (-x). так же позволяет делать сложение/вычитание с CF (carry flag), что позволяет программно обрабатывать числа большей разрядности. Так же используется для сравнения чисел. o Логический блок Вычисляет инверсию и двухоперандные логические функции. o Shifter (сдвиговый регистр) Осуществляет сдвиги и циклические сдвиги. (так же через CF) o Multiplier (умножитель) Умножает числа. o Некоторые ALU реализуют еще и частичное деление (деление занимает много тактов и каждый такт вычисляется только один шаг деления). Какой из блоков используется в текущий момент и как определяют линии Control.
------------------------------------------------------------------ Логические NOT C = not A AND C = A and B OR C = A or B XOR C = A xor B NAND C = A nand B NOR C = A nor B ------------------------------------------------------------------ Арифметические NEG C = -A C = A# + 1 ADD C = A + B ADC C = A + B + CF SUB C = A - B C = A + B# + 1 SBC C = A - B - CF C = A + B# + CF# ------------------------------------------------------------------ Сравнение CMP Set_Flags(A - B) результат игнорируется TEST Set_Flags(A and B) результат игнорируестся ------------------------------------------------------------------ Сдвиговые SHL C = A << N SHR C = A >> N SAL C = A << N SAR C = A >>> N ROL rotate left ROR rotate right RCL rotate left with CF RCR rotate right with CF ------------------------------------------------------------------ Умножение MUL C = A * B беззнаковое IMUL C = A * B знаковое Деление DIV C = A / B знаковое REM C = A % B остаток от деления IDIV C = A / B беззнаковое IREM C = A % B остаток от деления ------------------------------------------------------------------ Логические операции описаны в разделе 4.2. Арифметические операции описаны в разделе 11.*. Типичные операции в ALU
Сравнение: ------------------------------------------- Числа Условие ZF CF OF ------------------------------------------- Без знака A > B 0 0 - Без знака A == B 1 0 - Без знака A < B 0 1 - -------------------------------------------
Сдвиги: +--+ +-------------+ SHL/SAL |CF| < -- | | <-- 0 +--+ +-------------+ +-------------+ +--+ SHR 0 --- >| | --> |CF| +-------------+ +--+ +-------------+ +--+ SAR +--- >| | --> |CF| | +-------------+ +--+ +------+ при арифметическом сдвиге старший бит копируется сам в себя. +--+ +------------+ ROL |CF| < -+- | |< --+ +--+ | +------------+ | +--------------------+ +-------------+ +--+ ROR +-- >| |--+--> |CF| | +-------------+ | +--+ +---------------------+ +--+ +--------------+ RCL +---|CF|< ---| |< --+ | +--+ +--------------+ | +--------------------------------+ +---------------+ +--+ RCR +-- >| |--- >|CF|--+ | +---------------+ +--+ | +--------------------------------+
Пример простого однобитового ALU: