Найти тему
Разумный мир

Архитектура ЭВМ. Регистровая архитектура процессоров

Оглавление

Процессоры аккумуляторной архитектуры самые простые и дешевые. Стековая архитектура сложнее. Но идеальной архитектуры не существует. У каждой есть свои плюсы и минусы. Сравнением архитектур заниматься не будем, во всяком случае пока. Но посмотрим, можно ли предложить архитектуру более универсальную, чем ранее рассмотренные. Уточню, что речь идет об архитектуре ядра процессора. Точнее, лишь о части ядра.

Аккумуляторная архитектура проста, но наличие лишь одного регистра является ощутимым ограничением. В частности, это приводит к тому, что подавляющее большинство команд (арифметических и логических) выполняют обращение к внешней памяти. А это не самая быстрая операция. В стековой архитектуре регистров больше, но они организованы в виде стека и мы можем работать только с его вершиной. Это тоже ограничение. Зато арифметические и логические команды не обращаются к памяти.

Как мы можем если не снять, то уменьшить, ограничения? Одно из решений мы уже видели в статье

Архитектура ЭВМ. Аккумуляторная архитектура процессоров. Через стек к аккумулятору
Разумный мир25 июня 2023

В процессор были добавлены два регистра, которые использовались, неявно, некоторыми командами. Но эти регистры могли использоваться и для хранения данных. Это расширение аккумуляторной архитектуры, но оно не меняет характер архитектуры. По прежнему все команды выполняются только с аккумулятором, он хранит результат выполнения команды. Просто кроме адреса ячейки памяти мы может указывать и один из дополнительных регистров

Это небольшое, но весьма значимое расширение аккумуляторной архитектуры. В дополнительных регистрах можно сохранять промежуточные результаты вычислений избегая обращения к медленной внешней памяти.

Не важно, как именно обозначаются регистры. В любом случае, с точки зрения процессора регистр имеет свой номер. То есть, адрес. Очень сильно забегая вперед можно сказать, что у нас получаются два адресных пространства. Первое, пространство памяти. Мы не разделяем пока эту память на разные типы. Второе, внутренние регистры. Команда ADD, в нашем примере, по прежнему работает с двумя операндами. Первый находится в аккумуляторе, второй в ячейке с указанным адресом. Просто эта ячейка может быть либо в памяти, либо внутри процессора.

Лишаем аккумулятор особого статуса

С помощью дополнительных регистров мы можем повысить быстродействие и снимаем часть ограничений. Но аккумулятор по прежнему занимает привилегированное положение. Он участвует в любой операции (переходы и вызовы/возвраты мы сейчас не рассматриваем). Мы не можем напрямую поместить в наш R4 содержимое ячейки памяти. Это можно сделать только через аккумулятор. Равно как не можем поместить в ячейку памяти содержимое R4 напрямую.

А если мы попробуем лишить аккумулятор привилегированного статуса? Пусть все регистры будут равноправными. И мы сразу получаем не только преимущества, в виде повышения гибкости, но и проблемы, так как у нас в командах не будет предопределенного неявно используемого регистра. Нужно указывать все подробности. Или не совсем все? Давайте разбираться.

Прежде всего, введем два новых понятия:

  • Источник. Предоставляет/хранит исходные данные (операнд) для выполнения операции. Мы будем сокращенного обозначать источник как src.
  • Приемник. Принимает/хранит результат выполнения операции. Мы будем сокращенно обозначать приемник как dst.

И уточню, что мы понимаем по термином "операнд", который уже неоднократно использовался:

  • Операнд. Исходные данные, которые использует операция для получения результата.

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

-2

Теперь мы можем более внимательно посмотреть, например, на команду

ADD 1234

Мы знаем, что мнемоника ADD обозначает операцию сложения. Для этой операции нужно два слагаемых, которые мы называем операндами. Первое слагаемое, операнд, в обязательном порядке располагается в аккумуляторе. Для краткости будем обозначать аккумулятор как acc. Второй операнд, в чистой аккумуляторной архитектуре, в обязательном порядке располагается в памяти. Для краткости будем обозначать данные в памяти как mem. Оба операнда команды сложения являются источниками данных (src). Теперь мы можем записать команду сложения в более общем виде

ADD src

И можем записать, в общем виде, алгоритм ее выполнения

acc + src ⇒ acc

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

ADD mem

В нашем расширении процессора аккумуляторной архитектуры мы использовали дополнительные регистры. Для краткости будем обозначать их как reg. И разрешили указывать регистр в качестве источника операнда. И общий вид команды тоже изменился

ADD mem/reg

Запись mem/reg обозначает, что источник операнда может находится как в памяти, так и в регистре. Но мы можем записать операцию и совсем в общем виде

OP src

acc OP src ⇒ acc

Эта запись не должна вызывать у вас затруднений. OP обозначает ОПЕРАЦИЯ.

Если мы лишаем аккумулятор привилегированного статуса, то нам придется указывать оба источника операндов для нашей команды сложения. Например, так

ADD src, src

Но достаточно ли этого? Мы указали источники операндов, но не указали, куда помещать результат. Давайте это исправим

ADD src, src, dst

Это самый общий формат команды, наиболее гибкий, но и самый сложный в реализации. Поэтому в большинстве процессоров используется более простой вариант. Именно его и будем рассматривать. Давайте предположим, что источник одного из операндов одновременно является и приемником результата. Обозначим такой источнико-приемник как srcdst. И мы получаем такое

ADD srcdst, src

src + srcdst ⇒ srcdst

Не правда ли, очень похоже на то, что мы видели для аккумулятора? Но теперь мы можем в явном виде указывать любой источник и источнико-приемник. Нам удалось снять аккумулятор с пьедестала. Но получившееся решение является максимально общим, даже в варианте с двумя операндами команды, не говоря уже о трех. Ведь и источники, и приемник, может быть вообще любым. Да, такие процессоры существуют. Но мы сегодня их не рассматриваем.

Процессор регистровой архитектуры

Лишая аккумулятор привилегированного положения мы занимались скорее форматом машинных команд, а не архитектурой процессора. Давайте вернемся к процессору и вспомним, что у нас теперь есть несколько равноправных регистров. И мы можем использовать любой регистр, просто придется указывать это явно. Например, теперь вполне возможны такие команды

ADD R1, R2

ADD 1234, R5

ADD R3, 1234

Но давайте внимательно посмотрим на две последние команды. Первая (ADD 1234, R5) потребует два обращения к памяти, так как ячейка с адресом 1234 является и источником, и приемником. В полном соответствии с ранее рассмотренным форматом, где первый операнд является srcdst. А вот вторая команда (ADD R3, 1234) требует только одного обращения к памяти, так srcdst здесь R3.

Естественно, два обращения к памяти потребуют больше времени. Поэтому и команда будет выполняться дольше. Но для нас важнее другое. Если ячейка памяти может быть и источником, и приемником, то сложность процессора возрастает. При этом адрес ячейки памяти вычисляется (отдельным узлом процессора) лишь один раз.

Но и вариант, когда оба операнда команды располагаются в регистрах, требует усложнения процессора. Нужно будет или использовать блок регистров с двумя каналами доступа, или промежуточные регистры на входах АЛУ. Давайте рассмотрим эти варианты поближе

Выполнение команды OP reg,reg при использовании вспомогательных регистров-защелок на входах АЛУ. Иллюстрация моя
Выполнение команды OP reg,reg при использовании вспомогательных регистров-защелок на входах АЛУ. Иллюстрация моя

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

Выполнение команды OP reg,mem. Иллюстрация моя
Выполнение команды OP reg,mem. Иллюстрация моя

Для выбора источника нам потребовался мультиплексор (MUX), который переключает регистр-защелку на блок регистров или шину внешней памяти. Получателем результата является регистр. Осталось рассмотреть случай, когда ячейка памяти является и источником, и приемником

Выполнение команды OP mem,reg. Иллюстрация моя
Выполнение команды OP mem,reg. Иллюстрация моя

В данном случае добавляется демультиплексор (DMUX), который направляет результат операции в блок регистров или на шину памяти. И мы получили функциональную схему (конечно упрощенную) процессора с набором равноправных регистров, которые можно использовать при выполнении машинных команд.

Теперь мы можем определить, что же такое регистровая архитектура процессора. Процессор регистровой архитектуры имеет набор равноправных регистров используемых для работы с данными. Машинная команда может использовать любые регистры. При этом некоторые (или даже все) регистры могут иметь специальное назначение при выполнении некоторых команд. Все регистры доступны программисту непосредственно. Например, остаток от деления может помещаться в какой то определенный регистр безусловно, без явного указания в команде. При этом не имеет значения, требуется ли указывать приемник явно или в качестве приемника выступает один из операндов.

Но остается один тонкий момент. Помните, я сказал, что адрес операнда вычисляется лишь один раз за время выполнения команды? Это означает, что в команде может быть лишь один операнд в памяти, второй должен обязательно быть в регистре. Другими словами, возможны лишь такие варианты двухоперандных команд

OP reg, reg/mem

OP reg/mem, reg

Впрочем, даже это возможно не всегда. Для упрощения процессора вариант с srcdst расположенным в памяти может быть запрещен. Это ограничение, но архитектура процессора остается регистровой.

Более интересной является возможность выполнения команд вида

OP mem, mem

При этом регистры процессору вообще не требуются. Да, такие команды (память-память) могут быть разрешены в регистровом процессоре. Но это будет уже расширение регистровой архитектуры. И об этом в другой раз.

Заключение

Аккумуляторная архитектура является самой простой и позволяет строить дешевые процессоры. Но она является и самой ограниченной. Стековая архитектура сложнее, хоть мы и рассматривали ее первой. При этом ни в аккумуляторной, ни в стековой, архитектуре регистры процессора (аккумулятор и стек) не доступны программисту в явном виде. Главной особенностью регистровой архитектуры является то, что регистры равноправны и доступны программисту напрямую.

При этом надо понимать, что чистые рассмотренные архитектуры сегодня практически не встречаются. И определяющим является способ выполнения операций, а не наличие расширений архитектуры. Стековая остается стековой даже если допустить возможность использовать для одного из источников смещение от вершины стека (от SP). Аккумуляторная остается таковой даже если есть дополнительные регистры, но все операции выполняются только через аккумулятор. А наличие аппаратного стека, но размещаемого в памяти, не делает аккумуляторную или регистровую архитектуру стековой, если этот стек не используется в безусловном виде для выполнения всех операций.

До новых встреч!