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

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

- восемь 32-битных регистров, которые могут использоваться для хранения данных и адресов (регистры общего назначения, РОН): EAX/AX/AH/AL, EBX/BX/BH/BL, EDX/DX/DH/DL, ECX/CX/CH/CL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

- шесть сегментных регистров: CS, DS, SS, ES, FS, GS;

- регистры состояния и управления: регистр флагов EFLAGS/FLAGS и регистр указателя команды EIP/IP.

Некоторые регистры указаны с наклонной разделительной чертой – это части одного большого 32-разрядного регистра. Сделано так для обеспечения совместимости программ созданных как для 16-разрядных моделей микропроцессоров начиная с 8086, так и для 32-разрядных моделей, начиная с микропроцессора 80386. Количество регистров, за исключением сегментных, такое же, как у 8086, но размерность в два раза больше, что и отображено в обозначениях.

Регистры общего назначения разбиты на подгруппы:

- регистры данных;

- регистры указателей и индексов;

- регистры сегментов.

Регистры данныхпредназначены для выполнения арифметических, логических и других машинных операциях. К этой группе относятся 8 регистров (рис. 8): регистр аккумулятора AX, регистр базы BX, регистр счетчика CX, регистр данных DX. Для всех этих регистров возможен независимый доступ к старшей и младшей половинам. Старший байт обозначают буквой Н (High), младший L (Low) и первой буквой из названия регистра: АН и AL – в АХ, ВН и BL – в ВХ и т.д. Таким образом, возможен доступ ко всему регистру и к любой его половине.

 
 

 

 


Рис. 8. Регистры общего назначения.

 

 

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

Регистры указателей и индексовявляются неделимыми. К ним относятся указатель стека SP, указатель базы BP, индекс источника SI и индекс приемника DI (рис. 9). Они используется для модификации адресов. Если в команде операнд извлекается из памяти, то сослаться на него можно, указав некоторый адрес и некоторый регистр. В этом случае команда работает с исполнительным адресом, который вычисляется как сумма адреса, указанного в команде, и текущего значения указанного регистра. Из ячейки с таким адресом команда и будет извлекать операнд. Замена адреса, указанного в команде, на исполнительный адрес называется модификацией адреса, а используемый регистр – регистром-модификатором.

 

 
 

 

 


Рис. 9. Регистры указателей и индексов.

 

 

Выгода от такого способа задания операнда заключается в том, что, меняя значение регистра, можно одну и ту же команду использовать для работы с разными ячейками памяти (например, при обработке массивов при доступе к разным элементам). Модификаторами могут быть только регистры ВХ, ВР, SI и DI. Модифицировать адрес можно не только по одному регистру, но и по двум сразу, в этом случае разрешено использовать не любую пару модификаторов, а только такую, где один из регистров – ВХ или ВР, а другой – SI или DI.

Регистры SI и DI используются также для поддержки цепочечных операций, т.е. операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит. Регистр SI содержит текущий адрес элемента в цепочке-источнике, а DI – текущий адрес в цепочке-приемнике.

Регистр SP используется при работе со стеком. В стековых командах предполагается, что регистр SP указывает на ячейку памяти, в которой находится элемент, записанный в стек последним.

Сегментные регистрыпредназначены для сегментирования адресов. К ним относятся сегментные регистры кода CS, данных DS, стека SS и дополнительный сегментный регистр ES (рис. 10). В регистре CS должен находиться начальный адрес сегмента команд – области памяти, где расположены команды. Регистр DS должен ука­зывать на начало сегмента данных, в котором размещаются данные. Регистр SS должен указывать на начало области памяти, отведенной под стек.

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

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

 
 

 

 


Рис. 10. Сегментные регистры.

 

 

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

 
 

 

 


Рис. 11. Регистр указателя команд.

 

 

Регистр флагов.Флагпредставляет собой бит, принимающий зна­чение 1 (флаг установлен), если выполнено некоторое условие, и значение 0 (флаг сброшен) в противном случае. Всего доступно 9 флагов, причем кон­структивно они собраны в один 16-разрядный регистр (регистром флагов Flags) (рис. 12).

 

 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

        of df if tf sf zf   af   pf   cf

 

Рис. 12. Структура регистра флагов.

 

 

Все флаги делятся на две группы: флаги условий и флаги состояний. Флаги условий автоматически ме­няются при выполнении команд и фиксируют те или иные свойства их результата. Проверка таких флагов позволяет проанализировать результат выполнения команд. К флагам условий относятся:

- CF (Carry Flag) – флаг переноса используется в арифметических операциях над беззнаковыми. При переполнении разрядной сетки флаг CF устанавливается в 1. Флаг также управляется командами CLC, STC и CMC.

- OF (Overflow Flag) – флаг переполнения используется в арифметических операциях над числами со знаком. Например, если при сложении или вычитании знаковых чисел получился результат, по модулю превосходящий допустимую величину (переполнение мантиссы), тогда флаг OF устанавливается в 1.

- ZF (Zero Flag) – флаг нуля устанавливается в 1, если результат команды оказался нулевым.

- SF (Sign Flag) – флаг знака устанавливается в 1, если в результате выполнения операции над знаковыми числами получился отрицательный результат.

- PF (Parity Flag) – флаг четности равен 1, если в 8 младших битах результата очередной команды содержится четное количество двоичных единиц. Обычно учитывается в операциях ввода-вывода.

- AF (Auxiliary Carry Flag) – флаг дополнительного переноса фиксирует особен­ности выполнения операций над двоично-десятичными числами. Флаг равен 1, если при сложении 4 младших битов (младшей тетрады) операндов сумма превышает 15 (например, в командах сложения ADD, ADC, INC) или если тетрада первого операнда меньше тетрады второго (например, в командах вычитания SUB, SBB, DEC).

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

- DF (Direction Flag) – флаг направления устанавливает направление просмотра строк в строковых командах. Устанавливается командами CLD и STD. При DF=0 строки просматриваются от начала к концу, при DF=1 – в обратном направлении.

- IF (Interrupt Flag) – флаг прерываний устанавливается командами CLI и STI. При IF=0 процессор не реагирует на поступающие прерывания, при IF=1 блокировка снимается.

- TF (Trap Flag) – флаг трассировки. При TF=1 после выполнения каждой команды процессор делает прерывание, что удобно при отладке.

Остальные биты регистра флагов не используются и их значение всегда равно 0.