По назначению и способу использования регистры процессоров Intel можно разбить на группы:

 

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

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

EAX   AX
AH AL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

EBX   BX
BH BL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

ECX   CX
CH CL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

EDX   DX
DH DL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

ESI   SI
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

EDI   DI
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

EBP   BP
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

ESP   SP
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

Хотя эти регистры и могут использоваться для различных целей, но часть из них используются при выполнении некоторых специфичных действий:

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

Регистр ECX используется в качестве счетчика цикла в командах LOOP.

Регистры ESI и EDI используются как индексные регистры при работе со строковыми командами.

Для каждого 32-разрядного регистра общего назначения можно обращаться к его младшей половине как к отдельному 16-разрядному регистру (AX, BX, CX, DX, SI, DI, BP, SP). Кроме того к старшим и младшим половинам регистров AX, BX, CX и DX можно обращаться как к 8-разрядным регистрам (AH, AL, BH, BL, CH, CL, DH, DL).

 

Сегментные регистры

Все обращения к памяти происходят через один из шести сегментных регистров: CS, DS, ES, GS, FS и SS. В этих регистрах хранятся 16-разрядные селекторы сегментов. Регистры CS и SS закреплены за сегментами кода и стека соответственно. Остальные сегментные регистры могут использоваться для любых целей, однако регистры DS и ES используются командами, работающими со строками, а регистр DS по-умолчанию используется при обращении к данным.

 

Регистр флагов

Регистр флагов FLAGS (EFLAGS в 32-разрядном процессоре) - это специальный регистр, отображающий состояние процессора на момент выполнения команды.

0 0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

биты 31-22: Зарезервированы.
бит 21: Флаг идентификации ID. Если программа смогла установить или сбросить этот флаг, то это означает, что процессор поддерживает инструкцию CPUID.
бит 20: Флаг ожидания виртуального прерывания VIP (P5+). Этот флаг указывает процессору, что произошло аппаратное прерывание. Флаги VIF и VIP используются в многозадачных средах для того, чтобы каждая задача имела собственный виртуальный образ флага IF.
бит 19: Флаг виртуального прерывания VIF (P5+).
бит 18: Флаг контроля выравнивания AC (486+). Если установить этот флаг и флаг AM в регистре CR0, каждое обращение к памяти из программ, выполняющихся с CPL = 3, не выровненное на границу слова для слов и на границу двойного слова для двойных слов, будет вызывать исключение #АС.
бит 17: Флаг режима V86 (386+).
бит 16: Флаг возобновления RF. Когда этот флаг равен 1, отладочные исключения временно запрещены.
бит 15: Зарезервирован.
бит 14: Флаг вложенной задачи NT (286+). Этот флаг устанавливается в 1, если текущая задача является вложенной по отношению к какой-то другой — в обработчиках прерываний и исключений и вызванных командой call задачах. Флаг влияет на работу команды IRET.
биты 13-12: Уровень привилегий ввода-вывода IOPL (286+). Уровень привилегий ввода-вывода, с которым выполняется текущая программа или задача
бит 11: Флаг переполнения OF. Этот флаг устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице (то есть отрицательное) и наоборот.
бит 10: Флаг направления DF. Этот флаг контроллирует поведение команд обработки строк — когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, а когда DF = 0 — наоборот.
бит 9: Флаг разрешения прерываний IF. Установка этого флага в 1 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его устанавливают на короткое время для выполнения критических участков кода.
бит 8: Флаг трассировки TF. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой команды программы управление временно передается отладчику (вызывается прерывание 01h).
бит 7: Флаг знака SF. Этот флаг всегда равен старшему биту результата.
бит 6: Флаг нуля ZF. Устанавливается в 1, если результат предыдущей команды — ноль.
бит 5: Зарезервирован
бит 4: Флаг вспомогательного переноса AF. Флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
бит 3: Зарезервирован
бит 2: Флаг четности PF. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное. (Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, если он равен 1.).
бит 1: Зарезервирован
бит 0: Флаг переноса CF. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0.

 

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

Регистр указателя команд IP (или EIP в 32-разрядных процессорах) - это специальный регистр процессора, указывающий на ячейку памяти, где находится следующая выполняемая команда. Значение этого регистра нельзя изменить явным образом, с помощью команд присваивания. Единственные команды, влияющие на его значение - это команды перехода (JMP, JE, JNC, ...) и команды вызова и возврата из процедур (CALL, INT, RET, ...).

 

Регистры управления памятью

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

GDTR Linear address Limit
47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

GDTR (Global Descriptor Table Register): 6-байтный регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов (GDT) и ее 16-битный размер (минус 1). Каждый раз, когда происходит обращение к памяти, по селектору, находящемуся в сегментном регистре, определяется дескриптор из таблицы GDT или LDT, в котором записан адрес начала сегмента и другая информация.

IDTR Linear address Limit
47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

IDTR (Interrupt Descriptor Table Register): 6-байтный регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов обработчиков прерываний (IDT) и ее 16-битный размер (минус 1). Каждый раз, когда происходит прерывание или исключение, процессор передает управление на обработчик, описываемый дескриптором из IDT с соответствующим номером.

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

LDTR (Local Descriptor Table Register): 16-битный регистр, в котором содержится селектор для GDT, описывающий текущую таблицу локальных дескрипторов (LDT).

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

TR (Task Register): 16-битный регистр, в котором содержится селектор для GDT, описывающий TSS текущей задачи.

 

Регистры управления процессором

Пять 32-битных регистров CR0 – CR4 управляют функционированием процессора и работой отдельных его внутренних блоков.

CR0 PG CD NW - AM - WP - NE ET TS EM MP PE
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR0 (Control Register 0): 32-битный регистр, содержащий флаги управления процессором:

бит 31: Флаг страничной адресации PG (386+). Если бит установлен, то включен режим страничной адресации.
бит 30: Флаг отключения кэширования CD (486+). Если флаг установлен, то отключается запись в кэш 1 уровня. Считывание из кэша все равно будет происходить.
бит 29: Флаг сквозного кэширования NW (486+). Если флаг установлен, то отключается сквозная запись во внутренний кэш, то есть данные, записываемые в кэш, не появляются на внешних выводах процессора.
бит 18: Флаг контроля выравнивания AM (486+). Если флаг установлен, то флагу АС разрешается включать режим выравнивания данных.
бит 16: Флаг защиты от записи WP (486+). Если флаг установлен, то запрещается запись в страницы, помеченные как только для чтения на всех уровнях привилегий
бит 5: Флаг ошибки сопроцессора NE (486+). Если флаг установлен, то процессор при возникновении ошибки в операциях с плавающей точкой генерирует соответствующее исключение. Если флаг сброшен, то процессор генерирует прерывание, которое должно обрабатываться внешним контроллером прерываний.
бит 4: Флаг типа сопроцессора ET (386, 486). Если флаг сброшен, то это означает, что используется внешний сопроцессор. Если флаг установлен, то сопроцессор - встроенный. На всех новых процессорах этот флаг равен 1.
бит 3: Флаг переключенния задачи TS (286+). Процессор устанавливает этот флаг после переключения задачи. Если после этого выполнить любую команду сопроцессора, то процессор сгенерирует исключение.
бит 2: Флаг эмуляции сопроцессора EM (286+). Если флаг установлен, то каждая команда сопроцессора будет вызывать исключение.
бит 1: Флаг наличия сопроцессора MP (286+). Этот флаг влияет на выполнение команд WAIT и FWAIT. Должен быть установлен для совместимости с программами, написанными для 80286 и 80386 и использующими эту команду.
бит 0: Флаг защищенного режима PE (286+). Если флаг установлен, то процессор переключается в защищенный режим работы.

 

CR1 -
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR1 (Control Register 1): Зарезервирован.

 

CR2 Page-Fault Linear Address
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR2 (Control Register 2): 32-битный регистр, содержащий линейный адрес, вызвавший исключение "ошибка страницы". Код ошибки, запоминаемый при возникновении исключения сохраняется в стеке обработчика страничного нарушения.

 

CR3 Page-Directory Base - PCD PWT -
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR3 (Control Register 3): 32-битный регистр, содержащий физический адрес корневого каталога страниц памяти (биты 31-11, если флаг PAE в регистре CR4 сброшен; биты 31-5, если флаг PAE в регистре CR4 установлен), а также биты по управлению кэшированием страниц памяти:

бит 4: Флаг запрещения кэширования страниц PCD (486+). Если бит установлен, то текущая страница не будет загружена в кэш.
бит 3: Флаг сквозного кэширования страниц PWT (486+). Этот флаг управляет методом записи страниц во внешний кэш.

 

CR4 - FPE FSR PCE PGE MCE PAE PSE DE TSD PVI VME
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR4 (Control Register 4): 32-битный регистр, управляющий использованием архитектурных расширений процессоров Pentium и более новых. Наличие этих расширений необходимо проверять при помощи команды CPUID:

бит 10: Флаг поддержки операционной системой исключений XMM (PIII+). Если бит установлен, то разрешается генерация исключения #19 (ошибка SIMD). Если бит сброшен, будет генерироваться исключение #6 (недействительный код операции).
бит 9: Флаг поддержки команд FXSAVE/FXRSTOR (PII+). Этот флаг разрешает командам FXSAVE и FXRESTOR, сохранять и восстанавливать контекст XMM.
бит 8: Флаг разрешения команды RDPMC (P6+). Если этот флаг установлен, то выполнение команды RDPMC разрешено на всех уровнях привилегий. Если этот флаг сброшен, то выполнение команды RDPMC разрешено только на нулевом уровне привилегий.
бит 7: Флаг разрешения глобальности PGE (P6+). Если этот флаг установлен, то для элементов таблиц страниц допускается использование бита 8 (атрибут глобальности страницы).
бит 6: Флаг разрешения машинного контроля MCE (P5+). Если флаг установлен, то разрешается генерирование исключения #19, возникающего, когда блок внутреннего контроля операций обнаруживает ошибку.
бит 5: Флаг расширения физического адреса PAE (P6+). Если флаг установлен, то включается режим 36-битного физического адресного пространства.
бит 4: Флаг расширения размера страниц PSE (P5+). Если флаг установлен, то включается режим адресации с 4-мегабайтными страницами памяти.
бит 3: Флаг расширенной отладки DE (P5+). Позволяет устанавливать отладочные точки останова на обращение к портам ввода-вывода. Если флаг установлен, то любое обращение к регистрам DR4 и DR5 вызовет исключение #06 (недопустимый код операции). Если бит сброшен, то обращение к регистрам DR4 и DR5 приведет к обращению к регистрам DR6 и DR7 соответственно.
бит 2: Флаг запрещения счетчика времени RDTSC (P5+). Если флаг установлен, то выполнение команды RDTSC возможно только на нулевом уровне привилегий. Если флаг сброшен, то выполнение команды RDTSC возможно на всех уровнях привилегий.
бит 1: Флаг поддержки VIF (P5+). Если флаг установлен, то разрешается использование флага VIF.
бит 0: Флаг расширения виртуального режима VME (P5+). Если флаг установлен, то включается расширенная обработка прерываний и исключений в состоянии V86

 

Отладочные регистры

Восемь 32-разрядных регистров DR0-DR7 расширяют возможности по отладке программ на микропроцессорах Intel, начиная с 386 модели. Они устанавливают точки останова по данным и позволяют устанавливать точки останова по командам без модификации кода программ.

DR0-DR3 Линейный адрес точки останова
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистры DR0-DR3 содержат 32-битные линейные адреса четырех возможных точек останова по доступу к памяти.

DR4-DR5 -
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистры DR4-DR5 зарезервированы. На процессорах до Pentium, или если бит DE регистра CR4 равен нулю, обращение к этим регистрам приводит к обращению к DR6 и DR7 соответственно. Если бит DE = 1, происходит исключение #06 (недопустимая операция).

DR6 1 BT BS BD 0 1 B3 B2 B1 B0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистр DR6: 32-разрядный регистр состояния отладки. Он содержит информацию о причине отладочного останова для обработчика исключения #01 (отладочное прерывание):

биты 31-16: Зарезервированы. Должны быть 1.
бит 15: Если флаг BT установлен, то причина прерывания - установленный отладочный бит в TSS задачи, в которую произошло переключение.
бит 14: Если флаг BS установлен, то причина прерывания - установленный флаг трассировки TF в регистре EFLAGS.
бит 13: Если флаг BD установлен, то причина прерывания - попытка обращения программы к отладочным регистам при установленном бите GD регистра DR7.
бит 12: Зарезервирован. Должен быть 0.
биты 11-4: Зарезервированы. Должны быть 1.
бит 3: Если флаг B3 установлен, то причина прерывания - точка останова 3.
бит 2: Если флаг B2 установлен, то причина прерывания - точка останова 2.
бит 1: Если флаг B1 установлен, то причина прерывания - точка останова 1.
бит 0: Если флаг B0 установлен, то причина прерывания - точка останова 0.

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

DR7 LEN3 R/W3 LEN2 R/W2 LEN1 R/W1 LEN0 R/W0 0 0 GD 0 0 1 GE LE G3 L3 G2 L2 G1 L1 G0 L0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистр DR7: 32-разрядный регистр, задающий условие для точек останова:

биты 31-30: Размер точки останова 3.
00 - 1 байт
01 - 2 байта
10 - зарезервировано
11 - 4 байта
биты 29-28: Тип точки останова 3.
00 - на выполнение команды
01 - на запись
10 - на порт ввода-вывода (при установленном бите DE регистра CR4)
11 - на чтение/запись
биты 27-26: Размер точки останова 2.
биты 25-24: Тип точки останова 2.
биты 23-22: Размер точки останова 1.
биты 21-20: Тип точки останова 1.
биты 19-18: Размер точки останова 0.
биты 17-16: Тип точки останова 0.
биты 15-14: Зарезервированы. Должны быть 0.
бит 13: Флаг защиты отладочных регистров GD. Если флаг установлен, то включается режим, при котором обращение к любому отладочному регистру, даже из уровня привилегий 0, вызывает исключение #01. Этот бит автоматически сбрасывается внутри обработчика этого исключения.
биты 12-11: Зарезервированы. Должны быть 0.
бит 10: Зарезервирован. Должен быть 1.
бит 9: Флаг точного обнаружения инструкции в глобальной точке останова GE. Начиная с Pentium Pro не поддерживается. Должен быть 1.
бит 8: Флаг точного обнаружения инструкции в локальной точке останова LE. Начиная с Pentium Pro не поддерживается. Должен быть 1.
бит 7: Флаг включения глобальной точки останова 3. Действует на все задачи и не сбрасывается при переключении задач.
бит 6: Флаг включения локальной точки останова 3. Действует только на текущую задачу и сбрасывается при переключении на другую задачу.
бит 5: Флаг включения глобальной точки останова 2.
бит 4: Флаг включения локальной точки останова 2.
бит 3: Флаг включения глобальной точки останова 1.
бит 2: Флаг включения локальной точки останова 1.
бит 1: Флаг включения глобальной точки останова 0.
бит 0: Флаг включения локальной точки останова 0.

 

Регистры MMX

Регистры MMX - это восемь 64-разрядных регистров MM0-MM7. Однако, физически никаких новых регистров с введением ММХ не появилось — ММ0 – ММ7 — это в точности мантиссы восьми регистров FPU, от R0 до R7. При записи числа в регистр ММХ оно появляется в битах 63 – 0 соответствующего регистра FPU, а экспонента (биты 78 – 64) и ее знаковый бит (бит 79) заполняются единицами. Запись числа в регистр FPU также приводит к изменению соответствующего регистра ММХ. Таким образом, нельзя одновременно пользоваться командами для работы с числами с плавающей запятой и командами ММХ, а если это необходимо — следует пользоваться командами FSAVE/FRSTQR,каждый раз перед переходом от использования FPU к ММХ и обратно (эти команды сохраняют состояние регистров ММХ точно так же, как и FPU).