Выберите регистр процессора не относящийся к регистрам специального назначения

Обновлено: 04.07.2024

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

Рассмотрим лишь самые общие принципы построения и работы процессора, которые одинаковы как для примитивных, так и для самых современных процессоров.

Любой процессор имеет устройство, выполняющее команды, и собственную внутреннюю память , реализованную внутри микросхемы процессора. Она называется регистрами процессора. Имеется 3 типа регистров:

  • общие регистры хранят целые числа или адреса. Размер общего регистра совпадает с размером машинного слова и в 32-разрядной архитектуре равен четырем байтам. Число общих регистров и их назначение зависит от конкретного процессора. В большинстве Ассемблеров к ним можно обращаться по именам R0 , R1 , R2 , . Среди общих регистров имеются регистры специального назначения: указатель стека SP ( Stack Pointer ), счетчик команд PC ( Program Counter ) и др.;
  • регистр флагов содержит биты, которые устанавливаются в единицу или в ноль в зависимости от результата выполнения последней команды. Так, бит Z устанавливается в единицу, если результат равен нулю (Zero), бит N — если результат отрицательный (Negative), бит V — если произошло переполнение (oVerflow), бит С - если произошел перенос единицы из старшего или младшего разряда ( Carry ), например, при сложении двух целых чисел или при сдвиге. Значения битов в регистре флагов используются в командах условных переходов;
  • плавающие регистры содержат вещественные числа. В простых процессорах аппаратная поддержка арифметики вещественных чисел может отсутствовать. В этом случае плавающих регистров нет, а операции с вещественными числами реализуются программным путем.

Команды, или инструкции, процессора состоят из кода операции и операндов. Команда может вообще не иметь операндов или иметь один, два, три операнда. Команды с числом операндов большим трех встречаются лишь в процессорах специального назначения (служащих, например, для обработки сигналов) и в обычных архитектурах не используются. Чаще всего применяются двухадресные и трехадресные архитектуры: к двухадресным относятся, к примеру, все процессоры серии Intel 80x86 , к трехадресным — серии Motorola 68000. В двухадресной архитектуре команда сложения выглядит следующим образом:

т.е. один из аргументов команды является одновременно и ее результатом. Этот аргумент называется получателем (destination). Аргумент , который не меняется в результате выполнения команды, называется источником (source). Среди программистов нет единого мнения о том, в каком порядке записывать аргументы при использовании Ассемблера, т.е. в символической записи машинных команд. Например, в Ассемблере " masm " фирмы IBM для процессоров Intel 80x86 получатель всегда записывается первым, а источник вторым. Ассемблер " masm " используется в операционных системах MS DOS и Windows . В Ассемблере " as ", который входит в состав компилятора "gcc" и используется в системах типа Unix (Linux и т.п.), получатель всегда является последним аргументом. Та же команда сложения записывается в " as " как

что означает сложить Y и X и результат записать в X .

В трехадресной архитектуре команда сложения имеет 3 операнда:

Получателем в трехадресной архитектуре обычно является третий аргумент , т.е. в данном случае сумма X+Y записывается в Z .

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

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

Имеется несколько способов задания операнда, находящегося в оперативной памяти, они называются режимами адресации. Это

  • абсолютная адресация - когда в команде указывается константа, равная адресу аргумента ;
  • косвенная адресация - когда в команде указывается регистр, содержащий адрес аргумента ;
  • относительная адресация - адрес аргумента равен сумме содержимого регистра и константы, задающей смещение;
  • индексная адресация с масштабированием - адрес аргумента равен сумме содержимого базового регистра, константы, задающей смещение, а также содержимого индексного регистра, умноженного на масштабирующий множитель. Масштабирующий множитель может принимать значения 1, 2, 4, 8. Этот режим удобен для обращения к элементу массива.

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

CISC и RISC-процессоры

Существует два подхода к конструированию процессоров. Первый состоит в том, чтобы придумать как можно больше разных команд и предусмотреть как можно больше разных режимов адресации. Процессоры такого типа называются CISC-процессорами, от слов Сomplex Instruction Set Computers. Это, в частности, Intel 80x86 и Motorola 68000. Противоположный подход состоит в том, чтобы реализовать лишь минимальное множество команд и режимов адресации, процессоры такого типа называются RISC-процессорами, от слов Reduced Instruction Set Computers. Примеры RISC-процессоров: DEC Alpha, Power PC, Intel Itanium .

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

  1. все команды выполняются исключительно быстро, причем за одинаковое время, т.е. за фиксированное число тактов работы процессора;
  2. значительно поднимается тактовая частота процессора;
  3. намного увеличивается количество регистров процессора и объем кеш -памяти;
  4. удается добиться ортогональности режимов адресации, набора команд и набора регистров. Это означает, что нет каких-либо выделенных регистров или режимов адресации: в любых (или почти любых) командах можно использовать произвольные регистры и режимы адресации независимо друг от друга. Следует отметить, что к памяти могут обращаться лишь команды загрузки слова из памяти в регистр и записи из регистра в память, а все арифметические команды работают только с регистрами;
  5. простота команд позволяет эффективно организовать их выполнение в конвейере ( pipeline ), что значительно ускоряет работу программы.

Пункты 3 и 4 по достоинству оценят те, кому пришлось программировать на Ассемблере Intel 80x86 , имеющем ряд ограничений на использование регистров и режимы адресации, к тому же и регистров в нем очень мало.

RISC-архитектуры обладают неоспоримыми преимуществами по сравнению с CISC-архитектурами — быстродействием, низкой стоимостью, удобством программирования и т.д. — и практически не имеют недостатков. Существование CISC-процессоров в большинстве случаев объясняется лишь традицией и требованием совместимости со старым программным обеспечением. Впрочем, существует и третий вариант — процессоры, которые по сути являются RISC-процессорами, но эмулируют внешнюю систему команд устаревших процессоров, например, современные процессоры Intel Pentium.

Алгоритм работы компьютера

Среди всех регистров процессора в любой архитектуре всегда имеется два выделенных регистра: это регистр PC, что означает Program Counter , по-русски его называют счетчиком команд, и регистр SP — Stack Pointer , т.е. указатель стека. Иногда регистр PC обозначают как IP, что означает Instruction Pointer , указатель инструкции. (Команды процессора часто называют инструкциями.)

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

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

Intel 8086 – один из самых влиятельных из когда-либо созданных компьютерных чипов. Он создал архитектуру x86, доминирующую в современных настольных и серверных компьютерах. Я занимался реверс-инжинирингом 8086 на основе фотографий кристаллов, и в данной статье я опишу реализацию регистрового файла (набора регистров).



Кристалл 8086. Отмечено место хранения регистров. Верхние регистры используются блоком интерфейса шины для доступа к памяти, а нижние регистры общего назначения используются исполнительным блоком. Буфер команд – это 6-байтная очередь, состоящая из заранее запрошенных команд.

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

Рамкой обведены пятнадцать 16-битовых регистров 8086 и шесть байтов очереди предварительного запроса команд (предвыборки кода). Регистры занимают значительную часть кристалла, хотя в сумме их наберётся всего на 36 байт. Из-за ограничений по площади у первых микропроцессоров было относительно небольшое количество регистров. Для сравнения, у современных чипов процессоров есть килобайты регистров и мегабайты кэшей.

8086 был одним из самых ранних микропроцессоров, реализовавших предвыборку кода, однако у Motorola 68000 (1979) немного раньше появился буфер предвыборки на 4 байта. В мейнфреймах предвыборка существовала у IBM Stretch (1961), CDC 6600 (1964) и IBM System/360 Model 91 (1966).

Количество регистров у современного процессора подсчитать сложно. Единственное точное число, найденное мною, содержалось в книге "Анатомия высокоскоростного микропроцессора" (1997), подробно описывающей процессор AMD K6. Из-за переименования регистров у современных процессоров физических регистров гораздо больше, чем архитектурных (тех, что видны программисту), а количество физических регистров в документации не указывается. У K6, кроме восьми регистров х86 общего назначения, было 16 микроархитектурных рабочих регистров для переименования.

У процессоров с поддержкой AVX-512 есть 32 512-битовых регистра, то есть для одной этой функции зарезервировано 2 кБ регистров. В таких случаях размер регистров подсчитать ещё сложнее. Что до размера кэша, то у передовых процессоров его объём доходит до 77 МБ.

Как регистры реализуются в кремнии

Начну с описания того, как 8086 создаётся из N-МОП транзисторов. Затем объясню, как делается инвертор, как при помощи инверторов хранятся одиночные биты, и как делается регистр.

8086, как и другие чипы той эпохи, создавались на основе транзисторов типа N-МОП. Эти чипы состояли из кремниевой подложки, в которую при помощи диффузии внедряли примеси из мышьяка или бора, формировавшие транзисторы. Находящиеся над кремнием проводники из поликремния формировали вентили транзисторов и соединяли все компоненты друг с другом. Находившийся ещё выше металлический слой содержал дополнительные проводники. Для сравнения, современные процессоры используют технологию КМОП, комбинирующую N-МОП и P-МОП транзисторы, и содержат множество металлических слоёв.

На схеме ниже показан инвертор, состоящий из N-МОП транзистора и резистора. При низком входном напряжении транзистор выключен, поэтому подтягивающий резистор подтягивает выход вверх. При высоком входном напряжении транзистор включается, соединяет землю и выход, подтягивая выход вниз. Таким образом входящий сигнал инвертируется.

На самом деле, подтягивающий резистор в вентиле N-МОП представляет собой транзистор особого рода. Работающий в режиме обеднения транзистор ведёт себя, как резистор, будучи при этом более компактным и эффективным.



На схеме показано, как из транзистора и резистора получается инвертор. На фото показана реализация на чипе. Металлический слой удалён, чтобы было видно кремний и поликремний.

На фото выше видно, как физически сделан инвертор у 8086. Розоватые участки – это кремний с примесями, делающими его токопроводящим, а линии медного цвета – это поликремний сверху. Транзистор появляется там, где поликремний пересекается с кремнием. Поликремний формирует вентиль транзистора, а участки кремния с двух сторон дают исток и сток. Большой прямоугольник поликремния формирует подтягивающий резистор между +5 В и выходом. Таким образом, схема чипа совпадает со схемой инвертора. Подобные цепи можно рассмотреть под микроскопом и подвергнуть реверс-инжинирингу.

Строительный блок регистра – два инвертора в цепи обратной связи, хранящих один бит (см. ниже). Если на верхнем проводнике 0, правый инвертор выдаст 1 на нижний проводник. Затем левый инвертор выдаст 0 на верхний проводник, завершая цикл. Таким образом цепь оказывается стабильной и «помнит» 0. И наоборот, если на верхнем проводнике 1, она превратится в 0 на нижнем проводнике, и обратно в 1 на верхнем. В итоге цепь может хранить 0 или 1, формируя однобитную память.



У 8086 два спаренных инвертора хранят в регистре один бит. Схема стабильно находится в состоянии 0 или 1.

К паре инверторов добавляются три транзистора, чтобы получилась пригодная для использования ячейка регистра. Один транзистор выбирает ячейку для чтения, второй выбирает ячейку для записи, третий усиливает сигнал при чтении. В центре схемы ниже два инвертора хранят бит. Для чтения бита ток подаётся на красную шину. Это соединяет выход инвертора с разрядной шиной через усиливающий транзистор. Для записи бита ток подаётся на красную шину, соединяющую разрядную шину с инверторами. Подавая высокотоковые сигналы 0 или 1 на разрядную шину (и, соответственно, на хранящийся бит), мы заставляем инверторы переключаться на нужное значение. Отметьте, что разрядная шина используется и для чтения, и для записи.

В других процессорах используются несколько другие ячейки для хранения регистров. 6502 использует дополнительный транзистор в цепи обратной связи инвертора, чтобы разбивать цепь при записи нового значения. Z80 пишет одновременно в оба инвертора, что «облегчает» изменение, однако требует наличия двух проводников для записи. У 8086 есть усиливающий транзистор в каждой ячейке регистра для чтения, а другие процессоры считывают выходной сигнал с обоих инверторов и используют внешний дифференциальный усилитель для усиления сигнала. Базовая ячейка регистра 8086 состоит из 7 транзисторов (7Т), что больше, чем в типичной статичной ячейке RAM, использующей 6 или 4 транзистора, однако она использует только одну разрядную шину, а не две разных. Динамическая память (DRAM) работает гораздо эффективнее, и использует один транзистор и конденсатор, однако без обновления данных они будут утеряны.



Принципиальная схема хранящей бит ячейки регистра. Регистровый файл делается из массива таких ячеек.

Регистровый файл состоит из матрицы ячеек регистров, подобных описанному выше. Ширина матрицы составляет 16 ячеек, поскольку в регистрах хранятся 16-битные значения. Каждый регистр расположен по горизонтали, поэтому шина чтения или записи выбирает все ячейки определённого регистра. 16 вертикальных разрядных шин формируют единую шину, поэтому все 16 битов в выбранном регистре читаются и записываются параллельно.

На фото ниже показан увеличенный регистровый файл 8086 общего назначения, и видна матрица регистровых ячеек: 16 столбцов и 8 строк, 8 16-битных регистров. Затем дано увеличение одной регистровой ячейки в файле. Объясню, как реализована эта ячейка.



Фото кристалла 8086 с увеличением нижнего регистрового файла (восьми 16-битовых регистров), а потом и отдельной регистровой ячейки. Чтобы было видно кремниевые структуры, металлический и поликремниевый слои удалены.

8086 делается из кремния с примесями и поликремниевых проводников с металлическими проводниками сверху. На левом фото ниже показаны вертикальные металлические проводники регистровой ячейки. Отмечены земля, питание и проводники разрядной шины (оставшийся проводник пересекает регистровый файл, но не контачит с ним). На фото справа металлический слой растворён, чтобы было видно поликремний и кремний. Шины чтения и записи – это горизонтальные поликремниевые проводники. Поскольку у чипа только один металлический слой, в регистрах для вертикальных шин используется металл, а для горизонтальных – поликремний, чтобы они не пересекались друг с другом). Сквозные соединения металла и кремния видны как более яркие круги на фото с металлом и как кружки на фото с кремнием.



Ячейка хранения регистра. На фото слева показан металлический слой, а справа – соответствующие слои поликремния и кремния.

На диаграмме ниже показано соответствие физической схемы регистровой ячейки с принципиальной. Инверторы состоят из транзистора А и В и регистров. Транзисторы C, D и E формируются отмеченными кусочками поликремния. Разрядная шина не видна, поскольку располагается в металлическом слое. Отметьте, что схема ячейки памяти сильно оптимизирована для минимизации размера. Также отметьте, что транзистор А гораздо меньше других. У инвертора А довольно слабый выходной ток, поэтому разрядная шина может преодолеть его при записи.



Регистровая ячейка от 8086 с соответствующей схемой

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



Две пары ячеек памяти с разными цепями. У ячеек слева одна шина записи, а справа – отдельные шины записи для левых и правых битов.

Многопортовые регистры

Пока что мы рассмотрели восемь «нижних регистров» общего назначения. У 8086 есть также семь «верхних регистров», используемых для доступа к памяти, включая печально известные сегментные регистры. У этих регистров схема работы более сложная, многопортовая, позволяющая одновременно вести несколько процессов чтения и записи. К примеру, многопортовый регистровый файл позволяет прочесть счётчик программы, сегментный регистр и записать другой сегментный регистр – и всё это одновременно.

Приведённая ниже блок-схема отличается от большинства блок-схем для 8086, поскольку показывает реальную физическую реализацию процессора, а не ту, что представляет себе программист. В частности, на диаграмме показано два «регистра внутренних коммуникаций» среди регистров модуля интерфейса шины (справа) вместе с сегментными регистрами, совпадающими с 7 регистрами, которые можно рассмотреть на кристалле. Временные регистры, показанные ниже, физически являются частью АЛУ, поэтому в данной статье я их не рассматриваю.


В книжке "Разработка современных процессоров" обсуждаются сложные системы регистров в процессоре, начиная с 2000-х годов. Там написано, что сложность цепей быстро выходит за рамки трёх портов, а в некоторых передовых процессорах существуют регистровые файлы с 20 или более портами.

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



Многопортовая регистровая ячейка в процессоре 8086

У верхних регистров есть разное количество портов для чтения и записи: два регистра с 3 шинами чтения и 2 шинами записи, один регистр с 2 шинами чтения и 2 шинами записи, четыре регистра с 2 шинами чтения и 1 шиной записи. Три первых регистра – это, вероятно, счётчик программы, непрямой временный регистр и временный регистр операнда. Последние четыре – вероятно, сегментные регистры SS, DS, SS и ES. Также там есть три регистра буфера предварительной выборки команд, каждый с одной шиной для чтения и одной для записи.



Файл верхних регистров, состоящий из десяти 16-битных регистров. На фото видно кремний и поликремний. Вертикальные красные линии – остатки удалённого металлического слоя. Кликабельно.

Заключение

Хотя 8086 процессору уже 42 года, он до сих пор оказывает значительное влияние на современные компьютеры, поскольку архитектура х86 до сих пор очень часто используется. Регистры 8086 до сих пор существуют в современных компьютерах х86, хотя сегодня они уже имеют длину в 64 бита, а кроме этих регистров существует и множество других.

Кристалл 8086-го очень интересно изучать, поскольку его транзисторы можно рассмотреть под микроскопом. В своё время это был сложный процессор, поскольку на нём расположено 29 000 транзисторов, однако достаточно простой для того, чтобы отследить все цепи и понять, как они работают.

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

В микропроцессоре 8086 было восемь 16-разрядных регистров общего назначения. Все они могли выступать в качестве операндов основных арифметико - логических инструкций, но только четыре годились для целей адресации. Кроме того, каждый регистр имел свои специфические функции:

  • AX — аккумулятор. Использовался для хранения операндов в командах умножения и деления, ввода-вывода, в некоторых командах обработки строк и других операциях;
  • BX — регистр базы. Используется для хранения адреса или части адреса операнда, находящегося в памяти;
  • CX — счётчик. Содержит количество повторений строковых операций, циклов и сдвигов;
  • DX — регистр данных. Используется для косвенной адресации портов ввода-вывода, а также как «расширитель» аккумулятора в операциях удвоенной разрядности;
  • SI — регистр адреса источника. Используется в строковых операциях, а также в качестве индексного регистра при обращении к операндам в памяти;
  • DI — регистр адреса приёмника. Используется в строковых операциях, а также в качестве индексного регистра при обращении к операндам в памяти;
  • BP — указатель кадра стека. Используется для адресации операндов, расположенных в стеке;
  • SP — указатель стека. Используется при выполнении операций со стеком, но не для явной адресации операндов в стеке.

Первые четыре регистра могут делиться на две однобайтовых части каждый: AH, BH, CH и DH для старших байтов и AL, BL, CL и DL для младших байтов.

В микропроцессоре 80386 разрядность регистров была удвоена и составила 32 бита. Обновлённые регистры не заменили, а дополнили уже имеющиеся: 32-разрядные версии получили имена EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP, а их младшие слова сохранили прежние обозначения, причём у первых четырёх регистров сохранилась возможность раздельного обращения к двум младшим байтам (AH, AL и так далее). С помощью префикса изменения размера операнда возможно выполнение 32-разрядных операций в реальном режиме и режиме виртуального процессора 8086.

Другим важным новшеством процессора 80386 стало уменьшение «дискриминации» между регистрами: теперь компоненты 32-разрядных адресов можно хранить в любом регистре. Появилась также возможность масштабирования — использования содержимого регистра в качестве индекса, при вычислении адреса автоматически умножаемого на 2, 4 или 8. Однако при работе в реальном режиме и режиме виртуального процессора 8086 для адресации по-прежнему используются только BX, BP, SI и DI, отсутствует и возможность масштабирования.

Появление 64-разрядных микропроцессоров (технология EM64T/AMD64) повлекло серьёзные изменения в наборе регистров общего назначения. Суть изменений сводится к следующему:

Регистры микропроцессоров 1

Общие сведения.

При составлении программ в первую очередь необходимо

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

В регистровой модели современных процессоров обычно выделяют следу­ющие группы регистров:

● регистры, используемые при выполнении прикладных программ. К ним относят:

• основные функциональные регистры (регистры общего назначения; ука­затель команд, или программный счетчик; сегментные регистры; регистр флагов, или слова состояния);

обработки чисел с плавающей точкой (регистры данных, тегов, состояния, управления, регистры–указатели команды и операнда);

обработки пакетов чисел с плавающей точкой (регист­ры пакетов данных и регистр управления–состояния);

системные регистры (регистры управления режимом, регистры системных адресов, регистры отладки);

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

О неоднородности регистров.

Регистровая область памяти микропроцессора (

— регистровый сегмент) представляет собой набор неоднородных по возможности доступа и по выполняемым функциям регистров. Например, в рас­смотренном выше 8–разрядном процессоре:

● регистр команд является неадресуемым регистром и предназначен только для приема первого байта (кода команды) из памяти;

адресуемые регистры В и С могут быть использованы для хранения одного байта данных или 16–разрядного адреса (в паре);

указатель стека, представляющий собой 16–разрядный регистр, использует­ся для доступа к стеку путем явной и неявной (с помощью специальных ко­манд

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

Функциональная неоднородность области

процессора проявляется в специализации регистров. В зависимости от выполняемых функций можно вы­делить три группы регистров:

регистры данных, используемые в операциях АЛУ в качестве источника и приемника операндов;

адресные регистры, или указатели, предназначенные для формирования ад­ресов данных и команд;

специальные регистры, служащие для индикации текущего состояния про­цессора и управления режимами его работы.

Функциональная специализация затрудняет программирование (из–за необхо­димости учета организации регистров), однако позволяет создать быстро испол­няемую программу с меньшим требуемым объемом памяти для ее хранения.

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

Среди регистров данных важное место занимает аккуму­лятор А (

), который выполняет функции временного хранения исход­ных операндов и результатов операций арифметическо–логических устройств (АЛУ). Интенсивное использование аккумулятора и связанное с ним большинство команд арифметической и логической обработки операндов способствует сниже­нию загруженности шины данных, упрощению адресации, повышению быстро­действия процессора. В системах команд микропроцессора выделяются опера­ции с аккумулятором. Поэтому ссылка на аккумулятор при адресации, как прави­ло, производится неявно с помощью кода операции. Неявная адресация позволя­ет не указывать в командах месторасположение одного из операндов и (или) результата операции, что уменьшает длину их кода. В составе микропроцессора может быть не один, а два аккумулятора (например, в МС6809). К регистрам данных относятся явно адресуемые рабочие регистры

Рабочие регистры могут использоваться в операциях совместно с аккумулятором. Некоторые из них могут совмещать функцию хранения данных с функцией адресации. Для образования полноразмерного адреса регистры данных объединяются в пары.

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

К регистрам данных также относятся рассматриваемые ниже регистры общего назначения, которые совмещают функции хранения данных и адресов.

Среди регистров, на которые возложена функция адре­сации, следует выделить:

), или указатель инструкций–команд (

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

увеличивается на 1 или 2 для указания следующего байта или слова. Увеличение содержимого счетчика происходит автоматически сразу после начала выполнения команды. Изменение после­довательной выборки команд из ячеек памяти осуществляется путем загруз­ки программного счетчика адресом требуемой ячейки. Такая ситуация возни­кает, например:

• при выполнении команд условных и безусловных переходов;

• при инициализации микропроцессора путем сброса;

• при обслуживании запросов на прерывание;

используемый для обращений к систем­ному стеку. Стек представляет собой область памяти, предназначенную для хранения адресов возврата и состояний процессора (содержимого регист­ров) при вызове подпрограмм и обслуживании прерываний. Доступ к стеку организован по принципу «последним пришел — первым ушел» (

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

всегда показывает на последнюю заполненную ячейку, называемую вершиной стека (

Поэтому при операции за­писи (

) в стек элемента данных сначала содержимое указателя

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

) сначала элемент данных извлекается из стека, после чего содержимое указателя

увеличивается на 1 или 2.

Принцип взаимодействия указателя

рис. 2.4.1

со стеком проиллюстрирован на примере записи в стек и считывания из него четырех однобайтных элементов (рис. 2.4.1, а).

При операциях со стеком значение указателя

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

) — специально зарезерви­рованный адресный регистр. Регистр

, указывающий на начало области па­раметров в стеке (рис. 2.4.1, б), принадлежит к классу базовых регистров. В 16–разрядных процессорах указателем кадра служит индексный регистр ВХ;

регистры, предназначенные для хранения адресов обращения к основной па­мяти. Такие регистры, называемые указательными или индексными, позволя­ют сократить размер кода (программы). К ним следует отнести:

• регистры косвенного адреса (

), содержащие непосред­ственно адрес операнда;

), хранящие начальные (базовые) адреса массивов и записей;

индексные регистры I или X (

), содержимое которых является относи­тельным (смещенным) адресом операнда;

• регистры автоинкрементной и автодекрементной адресации, автоматиче­ски увеличивающие или уменьшающие свое содержимое после выполне­ния операции;

• регистры расширения адресного пространства (до 1М байт).

К специальным регистрам следует отнести регистр флагов (

), или регистр слова состояния программы (

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

На регистр флагов возлагается функция хранения признаков. С каждым при­знаком связывается одноразрядная переменная (бит), называемая флагом (флажком). Регистр флагов содержит:

биты признаков состояния процессора. Обычно эти признаки формируются в АЛУ после выполнения операции и характеризуют ее результат;

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

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

Ниже приведены обозначение, название и назначение флагов признаков состояния, а также показан принцип формирования некоторых флагов из отдельных бит

–разрядных операндов вида

, которые могут быть как исходным операндом, так и результатом выполненной операции:

Читайте также: