Общие сведения.
При составлении программ в первую очередь необходимо
знать, какие из регистров микропроцессора являются программно–доступными регистрами, в которых можно хранить подлежащие обработке данные (операнды), адреса и управляющие сигналы (команды). Совокупность программно–доступных регистров образуют регистровую модель микропроцессора. Адресация регистровой области процессора и быстрый доступ к ней обеспечивают создание эффективно исполняемых программ.
В регистровой модели современных процессоров обычно выделяют следующие группы регистров:
? регистры, используемые при выполнении прикладных программ. К ним относят:
• основные функциональные регистры (регистры общего назначения; указатель команд, или программный счетчик; сегментные регистры; регистр флагов, или слова состояния);
• регистры блока
FPU
обработки чисел с плавающей точкой (регистры данных, тегов, состояния, управления, регистры–указатели команды и операнда);
• регистры блока
SSE
обработки пакетов чисел с плавающей точкой (регистры пакетов данных и регистр управления–состояния);
? системные регистры (регистры управления режимом, регистры системных адресов, регистры отладки);
? служебные (модельно–специфические) регистры, которые используются в процессе отладки систем, содержат информацию о процессе выполнения программы (число декодированных команд, полученных запросов прерывания, число загрузок в кэш–память и т. п.), обеспечивают различные режимы работы кэш–памяти при обращении к определенным областям основной памяти
(MTRR
–регистры).
О неоднородности регистров.
Регистровая область памяти микропроцессора (
RSEG
— регистровый сегмент) представляет собой набор неоднородных по возможности доступа и по выполняемым функциям регистров. Например, в рассмотренном выше 8–разрядном процессоре:
? регистр команд является неадресуемым регистром и предназначен только для приема первого байта (кода команды) из памяти;
? адресуемые регистры В и С могут быть использованы для хранения одного байта данных или 16–разрядного адреса (в паре);
? указатель стека, представляющий собой 16–разрядный регистр, используется для доступа к стеку путем явной и неявной (с помощью специальных команд
PUSH
и
POP
) адресации;
? программный счетчик, или указатель команд, выполняет строго определенные функции и не может быть использован для хранения 16–разрядных операндов.
Функциональная неоднородность области
RSEG
процессора проявляется в специализации регистров. В зависимости от выполняемых функций можно выделить три группы регистров:
? регистры данных, используемые в операциях АЛУ в качестве источника и приемника операндов;
? адресные регистры, или указатели, предназначенные для формирования адресов данных и команд;
? специальные регистры, служащие для индикации текущего состояния процессора и управления режимами его работы.
Функциональная специализация затрудняет программирование (из–за необходимости учета организации регистров), однако позволяет создать быстро исполняемую программу с меньшим требуемым объемом памяти для ее хранения.
Регистры обозначаются латинскими буквами, используемыми для символического кодирования и отражающими назначение регистра.
Регистры данных.
Среди регистров данных важное место занимает аккумулятор А (
Accumulator
), который выполняет функции временного хранения исходных операндов и результатов операций арифметическо–логических устройств (АЛУ). Интенсивное использование аккумулятора и связанное с ним большинство команд арифметической и логической обработки операндов способствует снижению загруженности шины данных, упрощению адресации, повышению быстродействия процессора. В системах команд микропроцессора выделяются операции с аккумулятором. Поэтому ссылка на аккумулятор при адресации, как правило, производится неявно с помощью кода операции. Неявная адресация позволяет не указывать в командах месторасположение одного из операндов и (или) результата операции, что уменьшает длину их кода. В составе микропроцессора может быть не один, а два аккумулятора (например, в МС6809). К регистрам данных относятся явно адресуемые рабочие регистры
R
0,
R
1, …., используемые как сверхскоростные регистровые ОЗУ.
Рабочие регистры могут использоваться в операциях совместно с аккумулятором. Некоторые из них могут совмещать функцию хранения данных с функцией адресации. Для образования полноразмерного адреса регистры данных объединяются в пары.
В процессорах, предназначенных для работы в реальном времени, могут быть предусмотрены не один, а два или даже четыре (например, в некоторых микроконтроллерах) набора рабочих регистров. Один из регистров резервируется для системных целей или обработки прерываний, а остальные — для прикладных задач пользователя. В каждый момент времени доступен только один набор рабочих регистров, выбираемый специальным указателем.
К регистрам данных также относятся рассматриваемые ниже регистры общего назначения, которые совмещают функции хранения данных и адресов.
Адресные регистры.
Среди регистров, на которые возложена функция адресации, следует выделить:
?
программный счетчик (
Program
Counter
—
PC
), или указатель инструкций–команд (
Instruction
Pointer
—
IP
), хранящий адрес следующей команды выполняемой программы. Его разрядность обычно соответствует числу линий адресной шины. При выполнении программы с последовательно возрастающими адресами команд содержимое
PC
увеличивается на 1 или 2 для указания следующего байта или слова. Увеличение содержимого счетчика происходит автоматически сразу после начала выполнения команды. Изменение последовательной выборки команд из ячеек памяти осуществляется путем загрузки программного счетчика адресом требуемой ячейки. Такая ситуация возникает, например:
• при выполнении команд условных и безусловных переходов;
• при инициализации микропроцессора путем сброса;
• при обслуживании запросов на прерывание;
? указатель стека (
Stack
Pointer
—
SP),
используемый для обращений к системному стеку. Стек представляет собой область памяти, предназначенную для хранения адресов возврата и состояний процессора (содержимого регистров) при вызове подпрограмм и обслуживании прерываний. Доступ к стеку организован по принципу «последним пришел — первым ушел» (
Last
–
In
First
–
Out
—
LIFO),
т. е. в него можно только последовательно добавлять (вталкивать) или извлекать (выталкивать) элементы данных. Типовой стек, применяемый в большинстве процессоров, заполняется в сторону уменьшения адресов.
Указатель стека
SP
всегда показывает на последнюю заполненную ячейку, называемую вершиной стека (
Top
of
Stack
—
TOS).
Поэтому при операции записи (
PUSH
) в стек элемента данных сначала содержимое указателя
SP
уменьшается на 1 или 2 в зависимости от длины элемента (байт, два байта), формируя адрес ячейки, в которую затем помещается элемент. При операции считывания (
POP
или
PULL
) сначала элемент данных извлекается из стека, после чего содержимое указателя
SP
увеличивается на 1 или 2.
Принцип взаимодействия указателя
SP
со стеком проиллюстрирован на примере записи в стек и считывания из него четырех однобайтных элементов (рис. 2.4.1, а).
При операциях со стеком значение указателя
SP
непрерывно меняется, поэтому применять его в качестве точки отсчета при доступе к хранящимся в стеке данным вызывает определенные трудности. Поэтому в ряде случаев, например, при хранении в стеке локальных переменных или при обмене параметрами между вызываемой и вызывающей процедурой (подпрограммой), используется указатель кадра (
Frame
Pointer
—
FP
) — специально зарезервированный адресный регистр. Регистр
FP
, указывающий на начало области параметров в стеке (рис. 2.4.1, б), принадлежит к классу базовых регистров. В 16–разрядных процессорах указателем кадра служит индексный регистр ВХ;
?
регистры, предназначенные для хранения адресов обращения к основной памяти. Такие регистры, называемые указательными или индексными, позволяют сократить размер кода (программы). К ним следует отнести:
• регистры косвенного адреса (
Data
Pointer
—
DP
), содержащие непосредственно адрес операнда;
• регистры базы (
Base
Pointer
—
BP
), хранящие начальные (базовые) адреса массивов и записей;
• индексные регистры I или X (
Index
), содержимое которых является относительным (смещенным) адресом операнда;
• регистры автоинкрементной и автодекрементной адресации, автоматически увеличивающие или уменьшающие свое содержимое после выполнения операции;
• регистры расширения адресного пространства (до 1М байт).
Специальные регистры.
К специальным регистрам следует отнести регистр флагов (
Flag
), или регистр слова состояния программы (
Program
Status
Word
—
PSW),
а также ряд регистров, используемых в сопроцессорах и микроконтроллерах.
На регистр флагов возлагается функция хранения признаков. С каждым признаком связывается одноразрядная переменная (бит), называемая флагом (флажком). Регистр флагов содержит:
? биты признаков состояния процессора. Обычно эти признаки формируются в АЛУ после выполнения операции и характеризуют ее результат;
? биты управления и системных признаков, которые устанавливаются операционной системой (некоторые пользователем) и задают режим процессора при организации ввода–вывода данных, обслуживании прерываний и исключений, решении последовательности вызываемых задач и реализации ряда других процедур.
Упаковка всех флагов в одно слово и хранение в регистре дает возможность их быстрой пересылки в память с последующим восстановлением, например, при обслуживании запросов на прерывание.
Ниже приведены обозначение, название и назначение флагов признаков состояния, а также показан принцип формирования некоторых флагов из отдельных бит
n
–разрядных операндов вида
Dn
–1
Dn
–2
…
D
1
D
0
, которые могут быть как исходным операндом, так и результатом выполненной операции:
?
CF (Carry Fl
ag)
—
флаг
переноса
.
При арифметических операциях
CF =
Dn
— бит результата, полученный как перенос из старшего (
n
– 1) –го разряда АЛУ. При циклическом сдвиге влево
CF
=
Dn–1
и вправо
CF =
D0,
где
Dn–1, D0
— выдвинутое значение старшего, младшего разряда исходного операнда;
?
PF (Parity
Fl
ag)
— флаг четности результата: ?
PF =
?
n
-1
k=0
Dk,
где
?
— логическая операция исключающее ИЛИ. Значение
PF
=
1 фиксирует четное количество нулей в младшем байте;
?
AF
(Auxiliary Carry Flag)
— флаг дополнительного переноса или переноса из младшей тетрады:
AF
=
D
4
;
?
ZF (Zero Flag)
— флаг признака нуля: ?
ZF =
V
n
-1
k=0
Dk,
где V — операция логического сложения;
Dk
— биты результата операции
(ZF
= 0 — ненулевой результат,
ZF
= 1 — нулевой результат);
?
SF (Sign Flag)
— флаг знака результата:
SF
=
Dn–1,
при целочисленной арифметике со знаком
(SF
= 0 — знак плюс,
SF
= 1 — минус);
?
OF (Overflow Flag)
— флаг арифметического переполнения. При выполнении арифметики в дополнительном коде
OF =
Dn
?
Dn–1,
где
Dn,
Dn–1
— биты переноса и старший бит результата. Флаг
OF
= 1 фиксирует разные значения
Dn
и
Dn–1.
Назначение и функции некоторых флагов системных признаков:
?
DF (Direction Flag)
— флаг направления (бит управления):
DF =
0/1 вызывает автоматический инкремент/декремент содержимого индексных регистров
SI, DI
после выполнения команды обработки символа. Значение
DF
устанавливается пользователем и задает порядок обработки строк символов (от младших адресов к старшим или в обратном направлении) при выполнении соответствующих команд;
? IF (Interrupt Enable Flag) —
флаг
прерывания
.
При
IF
= 1 разрешает обслуживание прерывания по внешнему входу
INTR
;
?
TF
(
Trap
Flag
) — флаг трассировки. При
IF
= 1 разрешает пошаговое исполнение команд; используется при отладке программ;
?
NF
(
Add
/
Subtract
Flag
) — флаг сложения/вычитания:
NF
= 1, если в предыдущей команде выполнялось вычитание (использовался в процессоре
Z
80).
Регистры общего назначения.
В процессорах имеются регистры, функции которых не специализированы. Такие регистры получили название регистров общего назначения
POH
(
General
Purpose
Register
—
GPR
). В процессоре, не имеющем
POH,
каждая команда должна считывать свои операнды из памяти и возвращать результат также в память. На обращение к памяти расходуется время, которое можно уменьшить, если временно хранить часто используемые, операнды и результаты в быстродоступном месте, каким является
POH.
Регистры общего назначения обладают гибкими, взаимозаменяемыми (во многих командах) функциями. Применение РОИ дает возможность создавать регулярную систему команд, большинство из которых используют любой регистр многими способами. Поэтому в процессорах
POH
находят широкое применение.
Рассмотрим регистры общего назначения 16–разрядных процессоров. Они представляют интерес, поскольку составляют основу
POH
архитектуры 32–разрядных процессоров
(IA–32)
и используются до настоящего времени в реальном режиме. К обозначению имен 32–разрядных
POH
добавилась приставка
E
(
Extended
– расширенный).
Память
RSEG
16–битных процессоров 8086 содержит восемь регистров общего назначения АХ,
B
Х, СХ,
DX
,
BP
,
SP DI,
SI
, входящих в его регистровую модель (см. рис. 2.4.4, а). Допускается несколько применений регистров, причем их можно адресовать произвольно. Типичные команды могут привлекать любой регистр и ячейку памяти в качестве источника или (и) приемника. Большинство команд допускают нахождение обоих операндов в регистрах общего назначения. Следовательно, в команде можно указывать любую пару 16– или 8–битных регистров.
Регистры АХ,
D
Х, СХ и ВХ обычно используются для хранения данных и допускают отдельные обращения к их 8–битным половинам, каждой из которых дано свое название: младшие (
Low
) половины называются
AL, BL, CL
и
DL,
а старшие (
High
) — АН, ВН, СН и
DH
. Разделение
POH
на две половины позволяет одинаково легко оперировать байтами и словами. Обычно один РО
H
(а иногда и два) участвует в пересылках данных и в вычислениях. В некоторых командах функции отдельных регистров специализированы, например:
? регистры АХ (
Accumulator
— аккумулятор), ВХ (
Base
— база) и
DX
(
Data
— данные) наделены специальными функциями, вытекающими из их названия;
? регистр СХ (
Counter
— счетчик) может хранить в цепочечных командах число элементов цепочки (для этого нельзя использовать регистры АХ, ВХ и
DX
). Пять регистров общего назначения (ВХ,
SI, DI,
BP
,
SP
) могут хранить адреса и данные и привлекаются для вычисления адреса:
? регистр базы (ВХ), указатель стека (
Stack
Point
—
SP
) и указатель базы (
Base
Point
—
BP
) почти всегда используются как адресные регистры для хранения смещений. Смещение показывает расстояние от начала (базы) сегмента до операнда;
? указатель
SP
адресует вершину стека в памяти и автоматически используется в стековых командах
PUSH
и
POP
;
? регистр ВХ обычно применяется для хранения смещения в структуре данных, а не в текущем стеке. Без специального указания смещение в регистре ВХ относится к сегменту данных;
? указатель базы
BP
также часто используется для хранения смещения в текущем сегменте стека;
? индексные регистры источника (
Source
Index
—
SI
) и назначения (
Destination
Index
—
DI)
наиболее часто используются для доступа к данным в текущем сегменте данных. Предполагается, что смещение операнда–источника содержится в регистре
SI,
а операнда–приемника — в регистре
DI.
Существует и более узкая специализация регистров. В частности, регистр АХ выполняет функции аккумулятора; регистр
DX
может служить расширением аккумулятора до 32 разрядов.
Сегментные регистры.
Сегментные регистры играют важную роль при адресации операндов в памяти. Дело в том, что объем памяти 16–разрядных процессоров составляет 220 = 1М байт, а адреса имеют длину всего 16 бит и не могут адресовать всю память. Поэтому в памяти выделяются четыре сегмента емкостью 216 = 64К байт: кодовый сегмент (
Code
Segment
—
CS
), сегмент стека (
Stack
Segment
—
SS
), сегмент данных (
Data
Segment
) и дополнительный сегмент данных (
Extra
Segment
—
ES).
Для задания начального, или базового, адреса
(base20)
каждого из указанных сегментов в процессоре предусмотрены четыре 16–битных сегментных регистра с именами
CS, DS, SS
и
ES.
Базовый адрес текущего сегмента однозначно определяются содержимым сегментного регистра:
base20
=
16 x sel,
где
sel
— селектор, или значение (содержимое) сегментного регистра.
Адресация памяти реализуется следующим образом (рис. 2.4.2): команда задает смещение (
offset
) в сегменте, а сегментные регистры определяют требуемый сегмент. Выбор сегмента зависит от того, как команда использует смещение. Смещение может определять:
? следующую команду. Поскольку выборки всех команд осуществляются из текущего сегмента кода
CS,
в качестве регистра, содержащего смещение для следующей выполняемой команды, используется программный счетчик, или указатель команды;
? операнд для выполнения текущей команды. Сегмент, из которого считывается операнд, может быть задан в префиксе команды, указательном регистре или дополнительном регистре
ES.
Сегментация памяти и сегментные регистры играют важную роль в архитектуре процессора:
? обеспечивают модульность программ. Это объясняется тем, что код и данные размещаются относительно базового адреса сегмента, поскольку при каждом обращении к памяти участвует какой–либо сегментный регистр;
? придают коду и данным переместимость. Так как базовый адрес сегмента служит дополнительным компонентом механизма адресации программиста, любой сегмент можно перемещать в физической памяти, а затем правильно адресовать его, корректируя при этом только значение базы сегмента. Сегменты можно передавать как параметры, используя одно значение селектора;
? реализуют управление виртуальным адресным пространством, защиту памяти, многозадачность и другие функции.
Регистровые структуры микропроцессоров.
Рассмотрим наборы программно доступных регистров некоторых 8– и 16–разрядных процессоров, составляющих их регистровые модели.
8–разрядные процессоры.
На рис. 2.4.3, а приведен набор программно доступных регистров микропроцессора 8080 фирмы
Intel,
содержащий аккумулятор А, регистр флагов
F
и регистры общего назначения
B–L
.
Регистровые пары А и
F (PSW),
В и С (В),
D
и Е
(D)
Н и
L
(Н) могут быть использованы как 16–разрядные регистры для косвенной адресации. В них хранится адрес ячейки памяти. Наиболее часто используется регистровая пара Н.
Микропроцессор
Z80
фирмы
Zilog
имеет два блока регистров
A–L
(рис. 2.4.3, б), переключение которых осуществляется командой ЕХХ. Второй блок целесообразно использовать при вызове подпрограммы или при обработке запросов прерываний внешних устройств, так как в этом случае не потребуется стек.
В набор регистров входят также регистр вектора прерывания I (для хранения старшего байта адреса в режиме прерывания), регистр регенерации памяти
R
динамических ОЗУ и 16–разрядные индексные регистры IX,
IY.
В микропроцессоре МС6800 отсутствуют
POH
(рис. 2.4.3, в), однако имеется два аккумулятора А и В. Кроме них в процессоре содержится 16–разрядный регистр X для хранения адресов.
Указатель стека
SP
и программный счетчик
PC
имеется в регистровых структурах всех рассмотренных процессоров.
Как видно из рис. 2.4.3, б регистровая структура процессора
Z80
сложнее, чем 8080, хотя оба процессора имеют одинаковую архитектуру.
16–разрядные микропроцессоры
. Приведенный на рис. 2.4.4, а набор программно доступных регистров микропроцессора 8086 фирмы
I
ntel
рассмотрен выше.
В процессоре
Z8001
(рис. 2.2.4, б) имеется шестнадцать 16–разрядных
POH
R0…R15,
из которых
R0…R7
можно использовать как шестнадцать восьмиразрядных регистров. Составленные из
R0…R15
восемь регистровых пар
RR0 (R0, R1), RR1 (R1, R2)…
,
RR14 (R14, R15)
служат для хранения адресов. Имеется два составных регистра
RR
14, один из которых выполняет функцию указателя системного стека, другой — указателя стека пользователя.
Регистровая структура МП MC68000 (рис. 2.4.4, в
) объединяет шестнадцать 32–разрядных РОН: восемь регистров данных
D
0, ….,
D
7 и восемь адресных регистров А0, …, А7. Регистры
D
0, …,
D
7 позволяют получать формат данных в виде байта, 16–разрядного слова одинарной и двойной длины. При формировании адресов возможно сложение содержимого адресных регистров, кроме того, допускается использование адресов длиной в одно и два слова. Имеется два регистра А7, один из которых выполняет функцию указателя системного стека, другой — указателя стека пользователя. Регистровая структура MC68000 может использоваться в 32–разрядных процессорах.
Программный счетчик
PC
и регистр флагов
F
(регистр состояния) имеются в регистровых структурах всех рассмотренных процессоров.