3.3 Регистры
Регистр является устройством временного хранения данных и используется с целью облегчения арифметических, логических и пересылочных операций. Регистры 32-битных моделей IA-32 являются расширением регистров 16-битных моделей семейства.
Регистры общего назначения
Восемь регистров общего назначения имеют длину в 32 бит и содержат адреса или данные. Они поддерживают операнды-данные длиной 1, 8, 16, 32 и (при использовании двух регистров) 64 бит; битовые поля от 1 до 32 бит; операнды-адреса длиной 16 и 32 бит. Эти регистры называются EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Доступ к младшим 16 бит этих регистров выполняется независимо при использовании соответствующих имен 16-битных регистров: AX, BX, CX, DX, SI, DI, BP и SP. Также могут использоваться индивидуально младший (биты 0-7) и старший (биты 8-15) байты регистров AX, BX, CX, DX. Им соответствуют обозначения AH, DH, CH, BH и AL, DL, CL, BL. Формат регистров общего назначения показан на рисунке.
31 |
23 |
15 |
7 |
0 |
AH |
AL |
EAX | ||
DH |
DL |
EDX | ||
CH |
CL |
ECX | ||
BH |
BL |
EBX | ||
EBP | ||||
ESP | ||||
ESI | ||||
EDI |
Хотя регистр ESP тоже относится к регистрам общего назначения, он содержит указатель на вершину стека и его не стоит использовать для других целей.
Следует отметить, что регистры могут быть неравнозначны и при использовании определенных инструкций могут иметь специальное значение:
- EAX - аккумулятор, операнд-источник или приемник результата (некоторые инструкции могут быть короче на один байт при использовании EAX);
- EBX - указатель на данные в сегменте DS;
- ECX - счетчик для цепочечных (например, MOVS) и циклических (с префиксом REP и т.п.) инструкций;
- EDX - адрес порта ввода-вывода для инструкций IN/INS, OUT/OUTS;
- ESI - указатель на операнд-источник в сегменте DS для цепочечных инструкций;
- EDI - указатель на операнд-приемник в сегменте ES для цепочечных инструкций;
- EBP - указатель на данные в сегменте SS.
Сегментные регистры
Микропроцессор 80386 включает шесть непосредственно доступных 16-битных регистров селекторов сегментов. С каждым сегментным регистром ассоциирован программно-недоступный кэш дескриптора соответствующего сегмента, содержащий базовый адрес сегмента в линейном адресном пространстве, предел сегмента и атрибуты сегмента. Этот кэш заполняется при загрузке значения в сегментный регистр. В реальном режиме предел сегмента всегда 0FFFFh, атрибуты игнорируются, а базовый адрес вычисляется сдвигом значения селектора на 4 бита влево. В защищенном режиме кэш заполняется соответствующими значениями из дескрипторной таблицы.
15 |
7 |
0 | |||||||
CS |
линейный базовый адрес |
предел |
атрибуты |
||||||
SS |
линейный базовый адрес |
предел |
атрибуты |
||||||
DS |
линейный базовый адрес |
предел |
атрибуты |
||||||
ES |
линейный базовый адрес |
предел |
атрибуты |
||||||
FS |
линейный базовый адрес |
предел |
атрибуты |
||||||
GS |
линейный базовый адрес |
предел |
атрибуты |
||||||
Программно-недоступные поля (загружаются автоматически) |
Значения селекторов могут быть загружены при исполнении программы и являются специфичными для задачи. Это значит, что регистры сегментов в защищенном режиме перезагружаются автоматически при переключении микропроцессора на другую задачу. В то же время, использование сегментных регистров зависит от того, какая модель адресного пространства используется. При использовании сплошной модели в сегментные регистры загружается один и тот же селектор сегмента с базой 0 и пределом 0FFFFFFFFh, обеспечивая доступ ко всему линейному адресному пространству. При использовании сегментированной модели значения селекторов в сегментных регистрах независимы, так что программа может одновременно обращаться к шести сегментам.
Не все сегментные регистры равнозначны. Регистр CS хранит селектор сегмента кода. Процессор извлекает очередную инструкцию для исполнения, формируя логический адрес из селектора в CS и смещения в регистре EIP. Значение этого регистра нельзя изменить непосредственно, оно меняется в командах межсегментного перехода (FAR JMP), межсегментного вызова (FAR CALL), при вызове обработчика прерывания (INT) и при возврате из дальней процедуры (RETF) или обработчика прерывания (IRET).
Регистр SS хранит селектор сегмента стека. Стек используется для передачи параметров подпрограммам и для сохранения адреса возврата при вызове подпрограммы или обработчика прерывания. Вершиной стека считается байт, логический адрес которого образуется из селектора в регистре SS и смещения в регистре ESP. Программа может непосредственно изменить значение SS, что дает ей возможность переключаться между несколькими стеками. Причем на время выполнения команды MOV SS,xxxx и одной команды следующей за ней (обычно это MOV ESP,xxxx) запрещаются маскируемые и блокируются немаскируемые прерывания.
Регистры DS, ES, FS и GS хранят селекторы сегментов данных. Если инструкция обращается к памяти, но содержит только смещение, то считается, что она обращается к данным в сегменте DS. Сегмент ES может использоваться без явного указания в цепочечных командах. Сегменты FS и GS используются при обращении к памяти только при явном использовании в инструкции префиксов этих сегментов.
Указатель команд
Указатель команд (EIP) является 32-разрядным регистром. Он содержит смещение следующей команды, подлежащей выполнению. Относительный адрес отсчитывается от начала сегмента исполняемой задачи. Указатель команд непосредственно недоступен программисту, но он управляется явно командами управления потоком, прерываниями и исключениями (JMP, CALL, RET, IRET, команды условного перехода). Получить текущее значение EIP можно, если выполнить команду CALL, а затем прочитать слово на вершине стека.
Младшие 16 бит регистра EIP обозначаются IP и могут быть использованы процессором независимо при исполнении 16-битного кода.
Регистр системных флагов
Регистр EFLAGS содержит группу флагов состояния, управления и системных флагов. Младшие 16 бит регистра представляют собой 16-разрядный регистр флагов и состояния МП 8086, называемый FLAGS, который наиболее полезен при исполнении программ для МП 8086 и 80286. Структура регистра флагов показана на рисунке. Неопределенные биты зарезервированы, то есть на данный момент они не имеют значения, однако могут быть использованы для специальных целей в последующих версиях микропроцессора. Далее термин "установлен" означает значение 1, а термин "сброшен" - значение 0.
Некоторые из флагов могут быть изменены специально предназначенными для этой цели инструкциями. Для изменения или проверки группы флагов можно воспользоваться командами:
- LAHF/SAHF - загрузка/сохранение младших 8 битов регистра флагов в регистре AH;
- PUSHF/POPF - помещение/извлечение из стека младших 16 битов регистра флагов;
- PUSHFD/POPFD - помещение/извлечение из стека 32-битного регистра EFLAGS.
Флаги статуса CF, PF, AF, ZF, SF и OF отражают статус выполнения арифметических инструкций (таких как ADD, SUB, MUL, DIV).
- CF - флаг переноса (Carry Flag). Установлен, если операция привела к переносу из старшего бита при сложении или к займу для старшего бита при вычитании, иначе сброшен. Для 8-, 16-, 32-разрядных операций этот бит устанавливается при переносе из битов 7, 15 и 31 соответственно. Для беззнаковых операций флаг сигнализирует о переполнении. Значение этого флага может быть изменено непосредственно при помощи инструкций: CLC - сбросить CF в 0, STC - установить CF в 1, CMC - инвертировать CF. Также используется в операциях сдвига.
- PF - флаг четности (Parity Flag). Установлен, если младшие восемь бит операнда содержат четное число единиц (проверка на четность) иначе сброшен. На этот флаг влияют только младшие восемь бит независимо от длины операнда.
- AF - флаг вспомогательного переноса (Adjust Flag). Используется для упрощения сложения и вычитания упакованных двоично-десятичных чисел. Независимо от длины операнда (8, 16 или 32 бит) флаг AF установлен, если операция привела к займу из бита 3 при вычитании или переносу из бита 3 при сложении, иначе он сброшен.
- ZF - флаг нуля (Zero Flag). Установлен, если все биты результата равны нулю, иначе сброшен.
- SF - флаг знака (Sign Flag). Установлен, если установлен старший бит результата, иначе он сброшен. Для 8-, 16- и 32-разрядных операций этот флаг отражает состояние 7, 15 и 31 бита соответственно. Для знаковых чисел старший бит отражает знак числа: 0 - неотрицательное, 1 - отрицательное.
- OF - флаг переполнения (Overflow Flag). Флаг установлен, если операция привела к переносу (займу) в знаковый (самый старший) бит результата, но не привела к переносу (займу) из самого старшего бита, или наоборот. Для операций над числами со знаком сигнализирует о переполнении.
DF - флаг направления (Direction Flag) управляет поведением цепочечных инструкций (MOVS, CMPS, SCAS, LODS, STOS). Когда флаг сброшен, при выполнении цепочечной команды происходит автоинкремент адресов источника и приемника. Когда флаг установлен - автодекремент. Флаг можно непосредственно установить при помощи инструкции STD и сбросить при помощи CLD.
Системные флаги и поле IOPL влияют на процесс исполнения задачи, и поэтому не должны изменяться прикладной программой. Назначение этих флагов следующее:
- TF - флаг ловушки (Trap Flag). Установка флага TF переводит МП в пошаговый режим для отладки. Процессор автоматически генерирует исключение #1 после каждой команды, что позволяет проверить программу на исполнение каждой команды. Когда флаг TF сброшен, то ловушка по исключению #1 возникает в точках адресов останова, загружаемых в регистры отладки DR0-DR3.
- IF - флаг разрешения прерываний (Interrupt enable Flag). Установка флага IF позволяет МП воспринимать запросы внешних маскируемых прерываний. Очистка этого бита запрещает такие прерывания. Флаг не влияет на обработку, как немаскируемых внешних прерываний, так и исключений.
- IOPL - уровень привилегий ввода-вывода (I/O Privilege Level field, 286+). Это двухбитное поле используется в защищенном режиме. Биты IOPL показывают наивысшее значение текущего уровня привилегий (CPL), позволяющее выполнять команды ввода-вывода, не приводя к исключению #13 или обращению к битовой карте разрешения ввода-вывода. Это поле показывает также наивысшее значение CPL, которое позволяет изменять бит IF с помощью команд STI или CLI, а также при выборке нового значения из стека в регистр EFLAGS. Это поле может быть изменено инструкциями POPF или IRET только, если текущий уровень привилегий задачи равен 0.
- NT - флаг вложенной задачи (Nested Task flag, 286+). Если при переключении задач происходит вложение задач, то этот флаг устанавливается в 1. Совместно с полем "Связь TSS" в сегменте состояния задачи обеспечивает корректное вложение задач.
- RF - флаг возобновления (Resume Flag, 386+). Временно приостанавливает обработку исключений отладки (т.е. возвращает к нормальному исполнению программы) так, что исполнение команды может быть повторено после обработки исключения для отладки, не вызывая немедленно обработку другого исключения для отладки.
- VM - режим виртуального МП 8086 (Virtual-8086 Mode flag, 386+). Бит обеспечивает для задачи функционирование в режиме виртуального МП 8086. Бит VM может быть установлен только двумя способами: при восстановлении флагов из стека по инструкции IRET на нулевом уровне привилегий и переключением на задачу, в TSS которой в образе EFLAGS бит VM выставлен.
- AC - флаг контроля выравнивания (Alignment Check flag, 486+). Разрешает контроль выравнивания для текущей задачи. Контроль выравнивания производится, если CR0.AM=1 и EFLAGS.AC=1 и CR0.PE=1 и CPL=3. Контроль выравнивания тебует, чтобы при обращениях к памяти двойное слово обязательно должно начинаться с адреса, кратного 4, а 16-битное слово - с адреса, кратного 2, иначе генерируется нарушение контроля выравнивания (исключение #17).
- VIF - виртуальный флаг прерывания (Virtual Interrupt Flag, Pentium+). Виртуальный образ флага IF, используется совместно с флагом VIP. Процессор распознает VIF, если CR4.VME=1 или CR4.PVI=1 (разрешено расширение виртуального режима) и IOPL<3.
- VIP - виртуальный флаг задержки прерывания (Virtual Interrupt Pending flag, Pentium+). Системное ПО устанавливает этот флаг, если требуется отложить обработку прерывания. Используется совместно с VIF. Процессор читает этот флаг, но никогда не изменяет его. Флаг распознается, если CR4.VME=1 или CR4.PVI=1 (разрешено расширение виртуального режима) и IOPL<3.
- ID - флаг поддержки CPUID (Identification flag). Если программа может изменить этот флаг (т.е. процессор хранит то значение, которое программа запишет в этот флаг), то процессор поддерживает инструкцию CPUID. Инструкцию CPUID поддерживают не только Pentium и P6, но и некоторые модели i486.
Регистры управления сегментированной памятью
Эти регистры также известны как регистры системных адресов. Четыре регистра указывают на структуры данных, которые управляют механизмом сегментированной памяти. Они определены для ссылок на таблицы или сегменты, поддерживаемые моделью защиты микропроцессора.
Регистр глобальной дескрипторной таблицы (GDTR). Содержит 32-разрядный линейный адрес и 16-разрядную границу глобальной дескрипторной таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LGDT/SGDT. В реальном режиме этот регистр не используется. Перед переходом в защищенный режим в этот регистр следует загрузить корректные значения.
Регистр локальной дескрипторной таблицы (LDTR). Содержит 16-разрядный селектор локальной дескрипторной таблицы. С регистром связан программно-недоступный кэш дескриптора для хранения базового адреса, предела и атрибутов соответствующей дескрипторной таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LLDT/SLDT. В реальном режиме этот регистр не используется и попытка обращения к нему генерирует особый случай "недействительный код операции" (исключение #6). С каждой задачей в защищенном режиме может быть связана своя локальная дескрипторная таблица, поэтому селектор LDT хранится в TSS и автоматически загружается при переключении задач.
Регистр таблицы дескрипторов прерываний (IDTR). Указывает на таблицу точек входа в программы обработки прерываний. Регистр содержит 32-разрядный линейный базовый адрес и 16-разрядный предел таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LIDT/SIDT. При инициализации процессора базовый адрес IDT устанавливается в 0, а предел - 0FFFFh. В реальном режиме эта таблица хранит 4-байтные вектора прерываний, а в защищенном - дескритпоры шлюзов обработчиков прерываний и исключений. Это единственный регистр среди перечисленных, который используется в реальном режиме.
Регистр задачи (TR). Указывает на информацию, необходимую процессору для определения текущей задачи. Регистр содержит 16-разрядный селектор дескриптора сегмента состояния задачи. С регистром связан программно-недоступный кэш дескриптора TSS для хранения базового адреса, предела и атрибутов соответствующего сегмента состояния задачи. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LTR/STR. В реальном режиме этот регистр не используется и попытка обращения к нему генерирует особый случай "недействительный код операции" (исключение #6).
47 |
39 |
31 |
23 |
15 |
7 |
0 |
32-битный линейный базовый адрес |
16-битный предел |
GDTR | ||||
32-битный линейный базовый адрес |
16-битный предел |
IDTR |
15 |
7 |
0 |
||||
селектор |
LDTR | |||||
32-битный линейный базовый адрес |
16-битный предел |
атрибуты |
||||
селектор |
  Task Register | |||||
32-битный линейный базовый адрес |
16-битный предел |
атрибуты |
||||
Программно-недоступные поля (загружаются автоматически) |
Регистры управления
Микропроцессор имеет четыре 32-разрядных регистра управления CR0-CR4 (CR1 - зарезервирован), в которых хранятся флаги состояния процессора или глобальные флаги. Вместе с регистрами системных адресов эти регистры хранят информацию о состоянии процессора, которое влияет на все задачи в системе. Системным программистам регистры управления доступны только через варианты команды MOV, которые позволяют их загружать или сохранять в регистрах общего назначения. Формат четырех регистров представлен на рисунке.
Регистр CR0 содержит флаги, которые управляют или показывают условия, относящиеся к системе в целом, а не к отдельной задаче. Младшие 16 бит (биты с 0 по 15) этого регистра называются словом состояния машины (Machine Status Word - MSW) для совместимости с МП 80286.
- PE - разрешение защиты (Protection Enable, 286+). Когда PE=1 процессор находится в защищенном режиме. Если бит сброшен, то процессор находится либо в режиме реального адреса, либо в режиме системного управления (тип режима определяется аппаратно: в режиме системного управления активен сигнал SMIACT#).
- MP - наличие сопроцессора (Math Present, 286+). Влияет на выполнение команды WAIT/FWAIT, которая используется для взаимодействия с сопроцессором.
- EM - эмуляция сопроцессора (Emulation, 286+). Показывает, нужно ли эмулировать функции сопроцессора. Установка бита EM часто возникает в случае отсутствия сопроцессора в системе. Когда EM=1, любая команда для сопроцессора, команда MMX или SSE/SSE2 вызывает особый случай.
- TS - задача переключена (Task Switched, 286+). Процессор устанавливает этот бит при каждом переключении задач. Он также проверяет этот бит, когда интерпретирует команды сопроцессора, так как состояние последнего требуется сохранять только в случае запроса сопроцессора новой задачей. Бит TS может быть очищен загрузкой в регистр CR0, а также специальной командой CLTS.
- ET - тип расширения (Extension Type, 386, 486). Показывает тип сопроцессора: 80287 (ET=0), 80387 или встроенный FPU i486DX (ET=1). В новых моделях бит зарезервирован и всегда содержит 1.
- NE - ошибка сопроцессора (Numeric Error, 486+). Когда NE=1, процессору разрешается пользоваться внутренним ("родным") механизмом сигнализации ошибок с плавающей точкой. Когда NE=0, процессор эмулирует сигнализацию ошибок с плавающей точкой как у внешних сопроцессоров (80287, 80387), выставляя сигнал FERR#, который должен обрабатываться внешним контроллером прерываний.
- WP - защита от записи (Write Protect, 486+). Защита от записи страниц с пометкой "read-only" при обращениях с уровня супервизора.
- AM - маска выравнивания (Alignment Mask, 486+). Если CR0.AM=1 и EFLAGS.AC=1 и CR0.PE=1 и CPL=3, то производится контроль выравнивания. Т.е. при обращениях к памяти двойное слово обязательно должно начинаться с адреса, кратного 4, а 16-битное слово - с адреса, кратного 2, иначе генерируется нарушение контроля выравнивания (исключение #17).
- NW - несквозная запись (Not Write-through, 486+). Используется для управления кэшированием.
- CD - запрещение кэш-памяти (Cache Disable, 486+). Используется для управления кэшированием.
- PG - страничная трансляция (Paging, 386+). Определяет, использует ли микропроцессор таблицы страниц для трансляции линейных адресов в физические. Страничная трансляция используется только в защищенном режиме, и попытка выставить этот бит в реальном режиме приводит к нарушению общей защиты (исключение #13)
Регистр CR2 используется для обработки страничного нарушения, если установлен бит PG в регистре CR0. В регистре CR2 процессор сохраняет тот линейный адрес, который вызвал исключение. Код ошибки, запоминаемый при возникновении отказа в стеке обработчика страничного нарушения, обеспечивает дополнительную информацию о состоянии при этом исключении.
Регистр CR3 используется, когда установлен бит PG в регистре CR0. Этот регистр известен также как регистр каталога таблиц страниц (Page Directory Base Register - PDBR) Он позволяет процессору определить место расположения каталога таблиц страниц для текущей задачи. В старших 10 битах он содержит физический базовый адрес каталога таблиц страниц. Каталог таблиц страниц микропроцессора всегда выравнивается на размер страницы в 4Кбайт. Специальное назначение имеют биты 3 и 4, управляющие кэшированием страницы, на которой находится каталог таблиц:
- PWT - сквозная запись страницы (Page Write-Through, 486+);
- PCD - запрещение кэширования страницы (Page-Cache Disable, 486+).
Регистр CR4 управляет использованием тех или иных архитектурных расширений процессоров Pentium и более новых. Какими возможностями обладает процессор, можно узнать по результатам выполнения команды CPUID(1).
- VME - расширение виртуального режима (Virtual-8086 Mode Extensions, Pentium+). Разрешает расширения обработки прерываний и особых случаев в состоянии VM86. VME позволяют задаче в состоянии VM86 самостоятельно обрабатывать прерывания и особые случаи, не переключаясь в защищенный режим. VME обеспечивают аппаратную поддержку виртуального флага прерываний (VIF).
- PVI - поддержка виртуального флага прерываний (Protected-mode Virtual Interrupts, Pentium+). Разрешает аппаратную поддержку VIF.
- TSD - запрещение счетчика времени (Time Stamp Disable, Pentium+). Когда TSD=1, выполнение инструкции RDTSC (чтение внутреннего счетчика времени) ограничивается нулевым уровнем привилегий, иначе инструкция разрешена на всех уровнях.
- DE - расширение отладки (Debugging Extensions, Pentium+). Расширение отладки позволяет использовать регистры DR4 и DR5 для установки контрольных точек по портам ввода-вывода.
- PSE - расширение размера страниц (Page Size Extension, Pentium+). Расширение размера страницы позволяет в страничном преобразовании использовать страницы размером 4Мбайт (или 2Мбайт, если PAE=1).
- PAE - расширение физического адреса (Physical Address Extension, P6+). Расширение физического адреса позволяет в результате страничной трансляции генерировать 36-битные физические адреса.
- MCE - разрешение машинного контроля (Machine Check Enable, Pentium+). Разрешает особый случай машинного контроля (исключение #18), возникающий, когда блок внутреннего контроля операций внутри чипа или на шине обнаруживает ошибку.
- PGE - разрешение атрибута глобальности (Page Global Enable, P6+). Разрешает использование бита глобальности в элементах PDE/PTE. Это расширение позволяет часто используемые или разделяемые (shared) страницы пометить как "глобальные". Глобальные страницы не выгружаются из TLB при переключении задачи.
- PCE - разрешение счетчика производительности (Performance-monitoring Counter Enable, P6+). Когда PCE=1, выполнение инструкции RDPMC (чтение внутреннего счетчика производительности) разрешено на всех уровнях привилегий, иначе инструкция будет выполняться только на нулевом уровне привилегий.
- OSFXSR - поддержка операционной системой FXSAVE/FXRESTOR (OS support for FXSAVE/FXRESTOR instructions, Pentium II+). Разрешает командам FXSAVE/FXRESTOR, сохраняющим/восстанавливающим контекст сопроцессора, сохранять/восстанавливать контекст XMM.
- OSXMMEXCPT - поддерка операционной системой особых случаев XMM (OS support for XMM Exception, Pentium III+). Разрешает генерацию исключения #19 (ошибка SIMD), в противном случае немаскированные ошибки SIMD будут генерировать особый случай "недействительный код операции" (исключение #6).
Регистры отладки
Шесть доступных регистров отладки (DR0-DR3, DR6, DR7) расширяют возможности отладки МП. Они устанавливают точки останова по данным и позволяют устанавливать точки останова по командам без модификации сегментов программ. Регистры DR0-DR3 предназначены для хранения четырех линейных адресов точек останова. Регистры DR4 и DR5 зарезервированы. Формат регистров DR6 и DR7 показан на рисунке.
Регистр DR6 показывает текущее состояние точек останова:
- B0-B3 (386+) - флаги выставляются, когда для соответствующей точки останова выполняется условие отладки.
- BD - обнаружение доступа к регистрам отладки (386+). Флаг выставляется, если следующая инструкция собирается обратиться к регистрам отладки.
- BS - пошаговая отладка (386+). Флаг выставляется, если особый случай отладки вызван ловушкой пошаговой отладки (EFLAGS.TF=1).
- BT - переключение задачи (386+). Флаг выставляется, если произошло переключение на задачу, в сегменте TSS которой выставлен флаг ловушки отладки.
Регистр DR7 задает условие для точек останова:
- L0-L3 - локальные точки останова (386+). Точки останова действуют только в текущей задаче и при переключении задачи сбрасываются.
- G0-G3 - глобальные точки останова (386+). Точки останова действуют на все задачи и не сбрасываются при переключении задач.
- LE и GE - точное обнаружение инструкции в точке останова (386,486,Pentium). Не поддерживаются P6 и более новыми моделями.
- GD - защита регистров отладки (386+). Разрешение генерации исключения отладки в случае, если команда обратится к одному из регистров отладки.
- RW0-RW3 - условие контрольной точки (386+):
00 - исполнение инструкции по указанному адресу 01 - запись данных по указанному адресу 10 - обращение к порту ввода-вывода
(когда CR4.DE=1 только для Pentium+)11 - чтение или запись данных по указанному адресу - LEN0-LEN3 (386+) - длина контрольной точки для обращения к данным
(если RWx=00, то LENx тоже должно быть 00):
00 - 1 байт 01 - 2 байта 10 - резерв. 11 - 4 байта