Архитектура набора команд

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:24, 18 декабря 2016.

Архитектура набора команд (англ. Instruction Set Architecture, ISA) — часть архитектуры компьютера, определяющая программируемую часть ядра микропроцессора. Архитектура набора команд служит границей между аппаратурой и программным обеспечением и представляет ту часть системы, которая видна программисту или разработчику компиляторов. Следует отметить, что это наиболее частое употребление этого термина. В широком смысле архитектура охватывает понятие организации системы, включающее такие высокоуровневые аспекты разработки компьютера как систему памяти, структуру системной шины, организацию ввода/вывода и тому подобное.[1]

Общий обзор

Рис.1. Архитектура системы команд как интерфейс между АО и ПО

На этом уровне определяются реализованные в микропроцессоре конкретного типа:

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

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

Рис.2 Взаимосвязь АНК, компиляторов и АО

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

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

Когда появляется новая машина, первый вопрос, который задают все потенциальные покупатели: "Совместима ли машина с предыдущими версиями?" Второй вопрос: "Можно ли запустить на ней прежнюю операционную систему?" И третий вопрос: "Будут ли работать на этой машине прежние приложения и не потребуется ли заменять их новыми версиями?" Этот факт заставляет производителей компьютеров поддерживать один и тот же уровень команд в разных моделях или, по крайней мере, делать его обратно совместимым. Под обратной совместимостью мы понимаем способность новой машины выполнять старые программы без изменений. В то же время новая машина может поддерживать новые команды и иметь другие особенности, используемые новым программным обеспечением.

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

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

Классификация архитектур системы команд

Сложившуюся на настоящий момент ситуацию в области АСК иллюстрирует рисунок 3.

Рис.3 Развитие архитектур системы команд

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

По составу и сложности команд

Современная технология программирования ориентирована на языки высокого уровня, главная цель которых — облегчить процесс программирования. Но переход к ЯВУ породил серьезную проблему: сложные операторы, характерные для языков высокого уровня, существенно отличаются от простых машинных операций, реализуемых в большинстве вычислительных машин. Следствием такого несоответствия становится недостаточно эффективное выполнение программ. Проблема получила название семантического разрыва, а для ее разрешения разработчики вычислительных машин в настоящее время выбирают один из трех подходов и, соответственно, один из трех типов АСК:

  • архитектура с полным набором команд: CISC (Complex Instruction Set Computer)
  • архитектура с сокращенным набором команд: RISC (Reduced Instruction Set Computer);
  • архитектура с командными словами сверхбольшой длины: VLIW (Very Long Instruction Word).

В CISC-архитектуре семантический разрыв преодолевается за счет расширения системы команд, дополнения ее сложными командами, семантически аналогичными операторам языков высокого уровня (ЯВУ). Для CISC-архитектуры типичны:

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

К типу CISC можно отнести практически все ВМ, выпускавшиеся до середины 1980-х годов, и значительную часть производящихся в настоящее время. Рассмотренный способ решения проблемы семантического разрыва вместе с тем ведет к усложнению аппаратуры вычислительных машин (ВМ), главным образом, устройства управления, что, в свою очередь, негативно сказывается на производительности ВМ в целом. Это обстоятельство побудило более внимательно проанализировать программы, получаемые после компиляции с ЯВУ. Был предпринят комплекс исследований, в результате которых обнаружилось, что доля дополнительных команд, эквивалентных операторам ЯВУ, в общем объеме программ не превышает 10–20%, а для некоторых наиболее сложных команд даже 0,2%. В то же время объем аппаратных средств, требуемых для реализации таких дополнительных команд, возрастает весьма существенно. Так, емкость микропрограммной памяти, хранящей микропрограммы выполнения всех команд ВМ, из-за введения сложных команд может увеличиваться на 60%

Анализ результатов упомянутых исследований привел к пересмотру традиционных решений, следствием чего стало появление RISC-архитектуры. Идея заключается в ограничении списка команд ВМ наиболее часто используемыми простейшими командами, оперирующими данными, размещенными только в регистрах процессоров. Обращение к памяти допускается лишь с помощью специальных команд чтения и записи. Резко уменьшено количество форматов команд и способов указания адресов операндов. Эти меры позволили существенно упростить аппаратные средства ВМ и повысить их быстродействие. Оказалось, что реализация сложных команд за счет последовательности из простых, но быстрых RISC-команд не менее эффективна, чем аппаратный вариант сложных команд в CISC-архитектуре. Элементы RISC-архитектуры впервые появились в вычислительных машинах CDC 6600 и супер-ЭВМ компании Cray Research. Достаточно успешно реализуется RISC-архитектура и в современных ВМ.

Помимо CISC- и RISC-архитектур, в общей классификации был упомянут еще один тип АСК — архитектура с командными словами сверхбольшой длины (VLIW). Концепция VLIW базируется на RISC-архитектуре, но в ней несколько простых RISC-команд объединяются в одну сверхдлинную команду и выполняются параллельно. В плане АСК архитектура VLIW сравнительно мало отличается от RISC. Появился лишь дополнительный уровень параллелизма вычислений.

По месту хранения операндов

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

  • стековую;
  • аккумуляторную;
  • регистровую;
  • с выделенным доступом к памяти.

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

Стековая архитектура

Стеком называется память, по своей структурной организации отличная от основной памяти ВМ. Стек образует множество логически взаимосвязанных ячеек (рис. 2.4), взаимодействующих по принципу «последним вошел, первым вышел» (LIFO, Last In First Out). Принцип действия стека проиллюстрирован на рисунке 4.

Рис.4 Принцип действия стека

Основные узлы и информационные тракты одного из возможных вариантов ВМ на основе стековой АСК показаны на рисунке 5.

Рис.5 Архитектура ВМ на базе стека

Информация может быть занесена в вершину стека из памяти или из АЛУ. Для записи в стек содержимого ячейки памяти с адресом x выполняется команда push x, по которой информация считывается из ячейки памяти, заносится в регистр данных, а затем проталкивается в стек. Результат операции из АЛУ заносится в вершину стека автоматически. Сохранение содержимого вершины стека в ячейке памяти с адресом x производится командой pop x. По этой команде содержимое верхней ячейки стека подается на шину, с которой и производится запись в ячейку x, после чего все содержимое стека проталкивается на одну позицию вверх.

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

К достоинствам АСК на базе стека следует отнести возможность сокращения адресной части команд, поскольку все операции производятся через вершину стека, то есть адреса операндов и результата в командах арифметической и логической обработки информации указывать не нужно. Код программы получается компактным. Достаточно просто реализуется декодирование команд.

С другой стороны, стековая АСК по определению не предполагает произвольного доступа к памяти, из-за чего компилятору трудно создать эффективный программный код, хотя создание самих компиляторов упрощается. Кроме того, стек становится «узким местом» ВМ в плане повышения производительности. В силу упомянутых причин, данный вид АСК долгое время считался неперспективным и встречался, главным образом, в вычислительных машинах 1960-х годов.

Аккумуляторная архитектура

Рис.6 Архитектура ВМ на базе аккумулятора

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

Для загрузки в аккумулятор содержимого ячейки x предусмотрена команда загрузки load x. По этой команде информация считывается из ячейки памяти x, выход памяти подключается ко входам аккумулятора, и происходит занесение считанных данных в аккумулятор.

Запись содержимого аккумулятора в ячейку x осуществляется командой сохранения store x, при выполнении которой выходы аккумулятора подключаются к шине, после чего информация с шины записывается в память. Для выполнения операции в АЛУ производится считывание одного из операндов из памяти в регистр данных. Второй операнд находится в аккумуляторе. Выходы регистра данных и аккумулятора подключаются к соответствующим входам АЛУ. По окончании предписанной операции результат с выхода АЛУ заносится в аккумулятор.

Достоинствами аккумуляторной АСК можно считать короткие команды и простоту декодирования команд. Однако наличие всего одного регистра порождает многократные обращения к основной памяти.

Регистровая архитектура

Рис.7 Архитектура ВМ на базе регистров общего назначения

В машинах данного типа процессор включает в себя массив регистров общего назначения (РОН). Разрядность регистров обычно совпадает с размером машинного слова. К любому регистру можно обратиться, указав его номер. Количество РОН в архитектурах типа CISC обычно невелико (от 8 до 32), и для представления номера конкретного регистра необходимо не более пяти разрядов, благодаря чему в адресной части команд обработки допустимо одновременно указать номера двух, а зачастую и трех регистров (двух регистров операндов и регистра результата). RISC-архитектура предполагает использование существенно большего числа РОН (до нескольких сотен), однако типичная для таких ВМ длина команды (обычно 32 разряда) позволяет определить в команде до трех регистров. Регистровая архитектура допускает расположение операндов как в регистрах, так и в основной памяти, поэтому в рамках данной АСК выделяют три формата команд обработки:

  • регистр-регистр;
  • регистр-память;
  • память-память.

„Возможную структуру и информационные тракты вычислительной машины с регистровой архитектурой системы команд иллюстрирует рисунок 7. Операции загрузки регистров из памяти и сохранения содержимого регистров в памяти идентичны таким же операциям с аккумулятором. Отличие состоит в этапе выбора нужного регистра, обеспечиваемого соответствующими селекторами. Выполнение операции в АЛУ включает в себя:

  • определение местоположения первого операнда (регистр или память);
  • выбор регистра первого операнда или считывание первого операнда из памяти;
  • определение местоположения второго операнда (регистр или память);
  • выбор регистра второго операнда или считывание второго операнда из памяти;
  • подачу на вход АЛУ операндов и выполнение операции;
  • определение местоположения результата (регистр или память);
  • выбор регистра результата или ячейки памяти и занесение результата операции из АЛУ.

Архитектура с выделенным доступом к памяти

В архитектуре с выделенным доступом к памяти обращение к основной памяти возможно только с помощью двух специальных команд: load и store. В английской транскрипции данную архитектуру называют Load/Store architecture. Команда load (загрузка) обеспечивает считывание значения из основной памяти и занесение его в регистр процессора (в команде обычно указывается адрес ячейки памяти и номер регистра). Пересылка информации в противоположном направлении производится командой store (сохранение). Операнды во всех командах обработки информации могут находиться только в регистрах процессора (чаще всего в регистрах общего назначения). Результат операции также заносится в регистр.[3]

Рис.8 Архитектура ВМ с выделенным доступом к памяти

Методы адресации

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

Таблица 1. Основные методы адресации операндов
Метод адресации Использование
Регистровая Требуемое значение в регистре
Непосредственная или литеральная Для задания констант
Базовая со смещением Для обращения к локальным переменным
Косвенная регистровая Для обращения по указателю или вычисленному адресу
Индексная Иногда полезна при работе с массивами: R1 - база, R3 - индекс
Прямая или абсолютная Иногда полезна для обращения к статическим данным
Косвенная Если R3-адрес указателя p, то выбирается значение по этому указателю
Автоинкрементная Полезна для прохода в цикле по массиву с шагом: R2 - начало массива. В каждом цикле R2 получает приращение d
Автодекрементная Аналогична предыдущей. Обе могут использоваться для реализации стека
Базовая индексная со смещением и масштабированием Для индексации массивов

Типы команд

Команды традиционного машинного уровня можно разделить на несколько типов, которые показаны на таблице 2.[4]

Таблица 2. Основные типы команд
Типы операции Примеры
Арифметические и логические Целочисленные арифметические и логические операции: сложение, вычитание, логическое сложение, логическое умножение и т.д.
Пересылки данных Операции загрузки/записи
Управление потоком команд Безусловные и условные переходы, вызовы процедур и возвраты
Системные операции Системные вызовы, команды управления виртуальной памятью и т.д.
Операции с плавающей точкой Операции сложения, вычитания, умножения и деления над вещественными числами
Десятичные операции Десятичное сложение, умножение, преобразование форматов и т.д.
Операции над строками Пересылки, сравнения и поиск строк

Источники

  1. Википедия [Электронный ресурс]: Архитектура набора команд — материал из Википедии — свободной энциклопедии: Версия 78065000, сохранённая в 03:48, 29 апреля 2016. / Авторы Википедии // Википедия, свободная энциклопедия. — Электрон. дан. — Сан-Франциско: Фонд Викимедиа, 2016. — Режим доступа: https://ru.wikipedia.org/wiki/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4
  2. ПК Мастер [Электронный ресурс] : Уровень архитектуры набора команд / Дата обращения: 18 декабря 2016 - Режим доступа: http://www.island-formoza.ru/arhitektura-pc/glava-5-uroven-arhitekturi-nabora-komand.html
  3. Strorage.piter [Электронный ресурс] : Архитектура системы команд / Дата обращения: 18 декабря 2016 - Режим доступа: http://storage.piter.com/upload/contents/978549601145/978549601145_p.pdf
  4. CIT Forum [Электронный ресурс] : Основные архитектурные понятия / Дата обращения: 18 декабря 2016 - Режим доступа: http://citforum.ru/hardware/svk/glava_4.shtml