Пример организации регистров в микропроцессоре
Очень интересно проанализировать и сравнить организацию регистров в разных моделях процессоров примерно одного класса. В этом разделе мы познакомимся с двумя моделями 16-разрядных микропроцессоров, разработанными примерно в одно и то же время: Motorola MC68000 [STRI79] и Intel 8086 [MORS78]. Организация регистров микропроцессора MC68000 показана схематически на рис. 11.3,а, а микропроцессора Intel 8086 — на рис. 11.3.6. Регистры, имеющие отношение к абсолютно внутренним функциям процессора, как, например регистр адреса в памяти, на схемах не показаны.
В микропроцессоре MC68000 имеется восемь 32-разрядных регистров данных и девять регистров адреса такой же длины. Хотя основное назначение регистров данных — манипуляция со значениями операндов, они используются и в качестве индексных регистров при формировании исполнительного адреса. Разрядность регистров позволяет работать с 8-, 16- или 32-разрядными элементами
данных в зависимости от кода операции. Регистры адреса содержат 32-разрядные адреса (без сегментации). Два из них используются в качестве указателей стека: один — стека прикладной программы, а другой — стека операционной системы в соответствии с текущим режимом выполнения программы. Оба регистра имеют номер 7, поскольку в каждый момент времени может быть активным только один из них. В состав MC68000 входит также 32-разрядный счетчик команд и 16-битовый регистр состояния.
Разработчики фирмы Motorola создали систему команд с регулярной структурой, в которой отсутствуют регистры специального назначения. Стремление обеспечить высокую эффективность программы в машинном коде привела их к мысли разделить регистры на две функциональные группы и таким образом сэкономить один бит в поле спецификации регистра. Такой компромисс между универсальностью назначения регистров и компактностью машинного кода представляется вполне разумным.
Разработчики микропроцессора Intel 8086 использовали при организации регистров другой подход. Каждый регистр имеет свое назначение, хотя некоторые из них могут использоваться и в качестве универсальных. В составе Intel 8086 имеется четыре 16-разрядных регистра данных, которые можно адресовать как целиком (все 16 разрядов), так и побайтово, и четыре 16-разрядных регистра, предназначенных для формирования адреса. В некоторых командах регистры данных можно использовать в качестве универсальных. В других командах эти регистры используются неявно. Например, в команде умножения всегда используется аккумулятор. В большинстве команд неявно используются и четыре адресных регистра, каждый из которых содержит смещение внутри сегмента. Имеется также четыре 16-разрядных регистра сегментов. Три из них используются неявно и указывают на сегмент текущей команды (это весьма полезно при выполнении команд переходов), сегмент данных и сегмент, в котором размещен стек. Такое жесткое распределение функций между этими регистрами позволяет за счет ограниченной гибкости добиться компактного кодирования операций в коде команды. В состав микропроцессора Intel 8086 также входят указатель команды и набор флагов состояний и управления.
Из этого краткого описания двух конструкций процессоров следует, что не существует единого общепринятого подхода к организации регистров в процессоре (см. [TOON81]). Как и многие другие вопросы проектирования процессоров, эта проблема до сих пор является темой оживленных дискуссий и экспериментов.
Второй вывод, касающийся организации регистров в процессоре, иллюстрируется схемой регистров процессора Intel 80386, представленной на рис. 11.3,в [ELAY85]. Этот микропроцессор разрабатывался как 32-разрядная модификация процессора 8086. В состав процессора 80386 входят 32-разрядные регистры, но чтобы сохранить обратную совместимость программного обеспечения, в нем сохранена прежняя схема распределения функций между регистрами.
Рис. 11.3. Организация регистров в микропроцессорах: а — Motorola MC68000; б — Intel 8086; в — Intel 80386, 80486, Pentium, Pentium II