- •If (Interrupt Flag, бит 9) — флаг прерывания, определяющий реакцию процессора на запросы внешних прерываний по входу int (0 — прерывания запрещены, 1 — разрешены);
- •Способы адресации
- •Влияние команд на регистр флагов
- •Конвейерная обработка в процессоре Pentium
- •Развитие архитектуры Pentium
- •Расширенные регистры и типы данных процессоров x86
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
Расширенные регистры и типы данных процессоров x86
Регистры процессоров IA-32
С введением защищенного режима в процессоре i80286 появилась принципиально новая группа регистров — системные регистры, предназначенные для переключения между режимами и реализации возможностей защищенного режима. Системные регистры будут рассмотрены в главе "Системная архитектура процессоров IA-32 и Intel 64".
Обычные, несистемные регистры процессоров IA-32 таковы:
-
8 32-битных регистров общего назначения: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI;
-
6 16-битных сегментных регистров: ES, CS, SS, DS, FS, GS;
-
32-битный указатель команд EIP;
-
32-битный регистр флагов EFlags;
-
регистры FPU:
-
8 80-разрядных регистров данных;
-
16-битный управляющий регистр;
-
16-битный регистр состояния;
-
16-битный регистр тегов;
-
11-битный регистр кода операции;
-
48-битный указатель команд;
-
48-битный указатель данных (операндов);
-
8 64-битных регистров MMX.
-
8 128-битных регистров XMM;
-
32-битный регистр MXCSR (MMX Control and Status Register) — регистр управления и состояния устройства MMX.
Видно, что за исключением регистров FPU и MMX, это те же регистры i8086, только 32-битные (кроме сегментных регистров). Этот факт отражает первая буква E (extended) в названии регистров. Сегментные регистры имеют тот же размер, 16 бит, но их число увеличилось до шести.
Регистр флагов EFlags помимо признаков результата и управляющих флагов содержит новые флаги — системные, связанные с защищенным режимом и многозадачностью. Они, как и системные регистры, также будут рассмотрены в соответствующей главе.
Регистры MMX физически представляют собой 64-битную часть регистров данных FPU.
Регистры XMM появились в Pentium 4. Это уже физически отдельные регистры.
Регистры процессоров Intel64
Регистры процессоров Intel64:
-
16 64-битных регистров общего назначения: RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15;
-
6 16-битных сегментных регистров: ES, CS, SS, DS, FS, GS;
-
64-битный указатель команд RIP;
-
64-битный регистр флагов RFLAGS, старшие 32 бита зарезервированы, младшие равны EFLAGS;
-
регистры FPU:
-
8 80-разрядных регистров данных;
-
16-битный управляющий регистр;
-
16-битный регистр состояния;
-
16-битный регистр тегов;
-
11-битный регистр кода операции;
-
64-битный указатель команд;
-
64-битный указатель данных (операндов);
-
8 64-битных регистров MMX;
-
16 128-битных регистров XMM;
-
32-битный регистр MXCSR (MMX Control and Status Register) — регистр управления и состояния устройства MMX.
Системные регистры Intel64 будут рассмотрены в соответствующей главе.
Типы данных процессоров IA-32 и Intel64
Фундаментальные типы данных процессоров IA-32 и Intel64 таковы:
-
byte (байт, 8 бит);
-
word (слово, 16 бит);
-
double word (двойное слово, 32 бита);
-
quad word (учетверенное слово, 64 бита);
-
double quad word (двойное учетверенное слово, 128 бит).
Большинство команд оперируют этими данными без какой-либо дополнительной их типизации. Учетверенное слово было введено в i486, двойное учетверенное — в Pentium III с расширением SSE. В памяти операнды хранятся побайтно. Младшему байту операнда соответствует младший адрес (little endian order). Он является адресом и всего операнда. Выравнивание операндов в памяти (расположение слов по четным адресам, двойных слов — по адресам, кратным четырем и т. д.) повышает эффективность программы, так как уменьшается необходимое число обращений процессора к памяти. При этом слова, расположенные по нечетным адресам, но не пересекающие 4-байтную границу, также считаются выровненными и доступны за одно обращение. Некоторые команды, оперирующие с двойными учетверенными словами, генерируют исключение общей защиты (#GP), если операнды не выровнены.
Кроме размера некоторые команды требуют дополнительных признаков классификации операндов. Арифметические команды оперируют числами, которые, в свою очередь, могут быть следующих типов:
-
Byte Unsigned Integer;
-
Word Unsigned Integer;
-
Doubleword Unsigned Integer;
-
Quadword Unsigned Integer;
-
Byte Signed Integer;
-
Word Signed Integer;
-
Doubleword Signed Integer;
-
Quadword Signed Integer;
-
Single Precision Floating Point (32 бита);
-
Double Precision Floating Point (64 бита);
-
Double Extended Precision Floating Point (80 бит).
Также имеются различные типы данных MMX и XMM.
Система команд процессоров IA-32 и Intel 64
Формат команды процессоров IA-32 и Intel 64
Общий формат команды процессоров IA-32 и Intel 64 представлен на рис.

Рис. Формат команды процессоров IA-32 и Intel 64
Максимальная длина команды — 15 байтов.
Трехбайтный код операции имеют некоторые команды SSE и SSE2.
Префиксы
Префиксы делятся на четыре группы:
1. Блокировки и повторения:
F0H — LOCK;
F2H — REPNE/REPNZ;
F3H — REP/REPE/REPZ.
LOCK переводит одноименный сигнал в активный уровень на время выполнения команды, снабженной данным префиксом.
Префиксы повторения приводят к тому, что команда выполняется множество раз для заданного количества элементов строки. Префиксы повторения используются только со строковыми командами. Если они используются вместе с escape-кодом 0FH, то обрабатываются как обязательные префиксы для некоторых SIMD-команд.
2. Префиксы замены сегмента:
26H — ES;
2EH — CS;
36H — SS;
3EH — DS;
64H — FS;
65H — GS.
Префиксы указания ветвления:
2E — ветвление не принимается;
3E — ветвление принимается.
Префиксы указания ветвления позволяют программе давать указание процессору о наиболее вероятном пути хода программы. Они введены в Pentium 4 как часть SSE2.
Первые шесть префиксов могут быть использованы с любыми командами управления программой, последние два используются только с командами условных переходов.
3. Префикс замены размера операнда 66H. Если используется вместе с escape-кодом 0FH, то обрабатывается как обязательный префикс для некоторых SIMD-команд.
4. Префикс замены размера адреса 67H.
Примеры.
Команда преобразования двух упакованных знаковых двойных слов из регистра XMM или памяти в два упакованных числа с плавающей точкой удвоенной точности в регистре XMM:
CVTDQ2PD — F3 0F E6.
Здесь первый байт — обязательный префикс команд SSE/SSE2/SSE3, а не префикс повторения, второй байт — escape-код, третий — код операции.
Таким образом, код операции этой команды занимает два байта.
Команда горизонтального сложения 16-разрядных знаковых целых с упаковкой в регистр XMM:
PHADDW — 66 0F 38 01.
Здесь первый байт — обязательный префикс команд SSE/SSE2/SSE3, а не префикс замены размера операнда, второй байт — escape-код, третий и четвертый байты — собственно код операции.
Таким образом, код операции этой команды занимает три байта.
В 64-битном режиме в команде может быть использован еще один префикс — REX (коды 40-4FH), который должен стоять непосредственно перед кодом операции (рис.). При этом ограничение на длину команды в 15 байтов остается в силе.

Рис. Формат команды в 64-битном режиме
Пример.
MOV RAX,1122334455667788H — 48 B8 8877665544332211
В каждой команде может быть использовано по одному префиксу из каждой группы в любом порядке. Действие избыточных префиксов (более одного из группы) является неопределенным и меняется от процессора к процессору.
Формат кода операции
Код операции содержит, в свою очередь, более мелкие поля, которые определяют:
-
тип операции;
-
направление операции, т. е. куда записывается результат — в первый операнд или второй (d);
-
размер данных (w) — байт или полный размер (2 или 4 байта);
-
имя используемого регистра (reg, sreg2, sreg3, eee (CR или DR));
-
условие (cond (tttn));
-
расширение со знаком непосредственных данных (s).
Формат кода операции зависит от типа команды.
Многие команды, операнды которых находятся в памяти, имеют байт способа адресации (байт ModR/M — Mode, Register/Memory). Этот байт содержит три поля:
-
поле Mod (7-6 биты) в комбинации с полем R/M (биты 2-0) дает 32 возможных значения: 8 регистров и 24 способа адресации;
-
поле Reg/Opcode (R/O, биты 5-3) содержит имя регистра или дополнительную часть кода операции в зависимости от значения первичного кода операции;
-
поле R/M определяет используемый регистр или в комбинации с полем Mod — способ адресации.
Определенные значения байта ModR/M требуют еще одного байта — SIB (Scale, Index, Base) для полного определения способа адресации. Он содержит следующие поля:
-
Scale (биты 7-6) — коэффициент масштабирования;
-
Index (биты 5-3) — определяет номер индексного регистра;
-
Base (биты 2-0) — определяет номер регистра базы.
Формат префикса REX
Префикс REX также имеет собственный формат:
0100WRXB
Здесь
W 0 — размер операнда определяется CS.D
1 — размер операнда 64 бита
R — расширение поля ModR/M
X — расширение поля index байта SIB
B — расширение поля r/m байта ModR/M или поля base байта SIB или поля reg байта Opcode.
Способы адресации в процессорах Intel 64 и IA-32
Некоторые способы адресации требуют присутствия в команде смещения или непосредственных данных. Каждое из этих полей может занимать 1, 2 или 4 байта.
Можно выделить следующие типы адресации:
1. Регистровая:
MOV reg1, reg2 : 1000 100w : 11reg1reg2 : reg2 reg1
1000 101w : 11reg1reg2 : reg1 reg2
MOV AX, BX : 1000 1011 : 11000011 (8B C3) : AX BX
2. Непосредственная:
MOV reg, im : 1011w reg : immediate data
MOV CX, 0003 : 10111001 : 0300 (B9 03 00)
Адресация со стороны источника непосредственная, со стороны приемника — регистровая.
3. Прямая:
MOV AX, Var
4. Косвенная:
MOV AX, [BX]
5. По базе со сдвигом:
MOV AX, [BX+2]
6. Косвенная с масштабированием (и сдвигом):
MOV AX, [ESI*2]+2
7. По базе с индексированием (и сдвигом):
MOV AX, [BX+SI+2]
8. По базе с индексированием и масштабированием.
Последние четыре способа адресации представляют собой комбинации двух базовых типов: прямой и косвенной адресации.
Группы команд процессоров Intel 64 и IA-32
Команды процессоров Intel 64 и IA-32 делятся на следующие группы:
-
команды общего назначения (general purpose);
-
x87 FPU — начиная с i486;
-
MMX — Pentium MMX;
-
SSE — Pentium III;
-
SSE2 — Pentium 4;
-
SSE3 — Pentium 4 с технологией HT;
-
SSSE3 — Xeon 5100, Core;
-
системные;
-
режима IA-32e (64-битного);
-
VMX (Intel Virtualization Technology).
Команды общего назначения процессоров Intel 64 и IA-32
Команды общего назначения делятся на следующие подгруппы:
-
Команды передачи данных.
-
Команды целочисленной двоичной арифметики.
-
Команды десятичной арифметики.
-
Команды логических операций.
-
Команды сдвига.
-
Команды битовых и байтовых операций.
-
Команды передачи управления.
-
Команды строковых операций.
-
Команды ввода-вывода.
-
Команды управления флагами.
-
Команды операций над сегментными регистрами.
-
Другие команды.
СИСТЕМНАЯ АРХИТЕКТУРА ПРОЦЕССОРОВ IA-32 и Intel64
Системные регистры и структуры данных процессоров IA-32 и Intel64
Системные задачи
Системная архитектура (рис.) включает в себя множество регистров, структур данных и команд, предназначенных для выполнения следующих задач:
-
управления памятью;
-
защиты программных модулей;
-
реализации многозадачности;
-
реализации многопроцессорности;
-
обработки исключений и прерываний;
-
управления кэш-памятью;
-
управления питанием;
-
управления аппаратными средствами;
-
отладки и мониторинга производительности.
Системная архитектура неразрывно связана с защищенным режимом, поскольку все ее особенности проявляются только в нем. В реальном режиме процессоры x86 выглядят как i8086, только с регистрами общего назначения большего размера.

Рис. Системные регистры и структуры данных процессоров IA-32.

Рис. Системные регистры и структуры данных
процессоров Intel64 в режиме IA-32e
Основные структуры данных защищенного режима
Память в защищенном режиме может быть разделена на части двух типов: сегменты и страницы. Для выделения этих частей и работы с ними используются следующие структуры данных:
-
Селектор сегмента — 16-битная структура данных, содержащая индекс (номер) дескриптора сегмента в указанной таблице, текущий или запрашиваемый уровень привилегий. Для доступа к сегменту селектор должен быть загружен в соответствующий сегментный регистр.
-
Дескриптор сегмента — 8- или 16-байтная структура данных, содержащая базовый адрес (адрес начала) сегмента, лимит (предел) сегмента, другую необходимую информацию о сегменте. Дескриптор содержится в другой структуре — таблице дескрипторов, находящейся в памяти. При обращении к сегменту по его селектору дескриптор сегмента автоматически загружается в скрытую часть сегментного регистра.
-
Специальный дескриптор — дескриптор шлюза, специальной структуры, предназначенной для перехода между участками кода с различными свойствами.
-
Таблица страниц — структура, содержащая указатели на страницы.
-
Каталог страниц — структура, содержащая указатели на таблицы страницы.
-
Таблица указателей на каталоги страниц и т. д.
Существуют различные типы дескрипторов и таблиц дескрипторов.
Системные регистры IA-32
Существуют регистры, которые используются только в защищенном режиме или служат для переключения процессора в защищенный режим и обратно. Они называются системными регистрами. Их можно разделить на несколько групп:
-
Регистры управления памятью:
-
GDTR (Global Descriptor Table Register, регистр глобальной таблицы дескрипторов) — 6-байтный регистр, содержит базу и лимит (размер минус один) GDT (Global Descriptor Table, глобальной таблицы дескрипторов);
-
LDTR (Local Descriptor Table Register, регистр локальной таблицы дескрипторов) — 10-байтный регистр, содержит селектор и дескриптор LDT (Local Descriptor Table, локальной таблицы дескрипторов);
-
IDTR (Interrupt Descriptor Table Register, регистр таблицы дескрипторов прерываний) — 6-байтный регистр, содержит базу и лимит (размер минус один) IDT (Interrupt Descriptor Table, таблицы дескрипторов прерываний);
-
TR (Task Register, регистр задачи) — 10-байтный регистр, содержит селектор и дескриптор TSS (Task State Segment, сегмента состояния задачи) текущей задачи.
-
Регистры управления (Control Register, CR), пять 32-разрядных регистров: CR0, CR1, CR2, CR3, CR4. Содержат различные поля и флаги для управления процессором на системном уровне. В частности, бит 0 (PE, Protected mode Enable) регистра CR0 при установке в 1 переводит процессор в защищенный режим работы.
-
Отладочные регистры (Debug Register, DR), восемь 32-разрядных регистров: DR0-DR7. Позволяют отлаживать программу, определяя точки останова, не модифицируя код программ.
-
Машинно-специфичные регистры. Их число и назначение зависит от модели процессора. Например, в Pentium есть регистр TSC, счетчик тактов процессора. В Pentium Pro — регистры, используемые для подсчета различных событий: обращений к кэшу, умножений, команд MMX и т. п.
Особенности архитектуры Intel64
Основные особенности архитектуры Intel 64:
-
64-битное линейное адресное пространство для программного обеспечения;
-
физическое адресное пространство до 40 бит;
-
8 дополнительных регистров общего назначения (GPRs): R8-R15;
-
8 дополнительных регистров XMM (SSE, SSE2, SSE3, SSSE3);
-
64-битные GPRs и IP, в названии вместо буквы E используется буква R — RAX, RIP и т. п.;
-
64-битный регистр флагов RFLAGS, старшие 32 бита зарезервированы, младшие равны EFLAGS;
-
64-битный указатель стека RSP;
-
64-битные управляющие регистры, дополнительный управляющий регистр CR8 или TPR (task priority register);
-
64-битные отладочные регистры;
-
регистр глобальной таблицы дескрипторов (GDTR) регистр таблицы дескрипторов прерываний (IDTR) расширены до 10 байт, так что они содержат полный 64-битный базовый адрес;
-
регистр локальной таблицы дескрипторов (LDTR) и регистр задач (TR) также расширены для содержания полного 64-битного базового адреса.
Размер и использование регистров общего назначения определяет префикс REX:
|
Размер регистра |
без префикса REX |
с префиксом REX |
|
Byte |
AL, BL, CL, DL, AH, BH, CH, DH |
AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L |
|
Word |
AX, BX, CX, DX, DI, SI, BP, SP |
AX, BX, CX, DX, DI, SI, BP, SP, R8W - R15W |
|
Doubleword |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D - R15D |
|
Quadword |
N.A. |
RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8 - R15 |
Сегментные регистры и селектор сегмента
Сегментные регистры используются и в реальном, и в защищенном режимах, но по разному. В реальном режиме сегментный регистр содержит базовый (начальный) адрес сегмента, деленный на 16, а в защищенном режиме — селектор сегмента (рис.).

Рис. Формат селектора.
RPL (Requested Privilege Level) — запрошенный программой уровень привилегий.
TI (Table Indicator) — указатель таблицы. Если TI=0, то дескриптор, на который указывает индекс селектора находится в глобальной таблице дескрипторов (Global Descriptor Table, GDT), в противном случае — в локальной таблице дескрипторов (Local Descriptor Table, LDT).
Индекс — номер (указатель) дескриптора в указанной таблице дескрипторов.
Таким образом, селектор содержит указатель на дескриптор, а дескриптор — указатель на сегмент — базу или начальный адрес сегмента.
В защищенном режиме логический адрес представляет собой пару "селектор:смещение".
Первая часть логического адреса — селектор, находящийся в сегментном регистре, указывает на дескриптор, из которого берется база и прибавляется ко второй части логического адреса — смещению, которое теперь уже может быть 32- или 64-битным. Эта сумма представляет собой линейный адрес, который является физическим, если не включена страничная адресация.
Размер сегментного регистра во всех процессорах x86 — 16 бит. Однако в защищенном режиме используется также его скрытая часть, размер которой равен размеру дескриптора сегмента, которая и предназначена для загрузки в нее соответствующего дескриптора из таблицы дескрипторов, находящейся в памяти, для более быстрого обращения к сегменту.
Загрузить сегментные регистры можно явно: MOV, POP, LDS, LES, LSS, LGS, LFS — или неявно: CALL, JMP, RET, SYSENTER, SYSEXIT, IRET, INT n, INTO, INT3. Как видно, явно загружаются все сегментные регистры, кроме CS, неявно — CS и в некоторых случаях другие сегментные регистры.
Селектор сегмента состояния задачи (TSS) находится в регистре задачи (TR).
Системные флаги
Регистр флагов в процессорах семейства IA-32 называется EFLAGS и имеет размер 32 бита, семейства Intel64 — RFLAGS и имеет размер 64 бита. Однако множество флагов и распределение флагов по битам в этих регистрах одинаково, поскольку старшие 32 бита в RFLAGS зарезервированы, а младшие равны EFLAGS.
Регистр флагов в целом используется и в реальном, и в защищенном режимах. Но в его составе имеется группа системных флагов, которая используется только в защищенном режиме:
-
бит 21 — ID, флаг идентификации, если программа может изменить значение этого флага, то процессор поддерживает команду CPUID (начиная с Pentium);
-
бит 20 — VIP, флаг ожидания виртуального прерывания, указывает процессору, что произошло аппаратное прерывание;
-
бит 19 — VIF, флаг виртуального прерывания — виртуальный образ флага IF (начиная с Pentium);
-
бит 18 — AC, флаг контроля выравнивания в памяти. Если установить этот флаг и флаг AM в регистре CR0, то каждое обращение к памяти из программ, выполняющихся с CPL=3, невыравненное на границу слова для слов и на границу двойного слова для двойных слов, будет вызывать исключение #AC;
-
бит 17 — VM, флаг режима виртуального 8086 (V86). Его установка переводит процессор в режим V86;
-
бит 16 — RF, флаг возобновления (продолжения задачи). Когда он равен 1, отладочные исключения запрещены. Устанавливается командой IRETD из обработчика отладочного прерывания, для того чтобы #DB не произошло перед выполнением команды, которая его вызвала, еще раз. На флаг не влияют команды POPF, PUSHF, IRET;
-
бит 14 — NT, флаг вложенности задачи. Равен 1, если текущая задача является вложенной по отношению к другой — в обработчиках прерываний и исключений и задачах, вызванных командой CALL. Влияет на работу команды IRET;
-
биты 12-13 — IOPL, уровень привилегий ввода-вывода, с которым выполняется текущая программа или задача. Чтобы программа (задача) могла обратиться к порту ввода-вывода, ее текущий уровень привилегий (CPL) должен быть не больше IOPL. IOPL можно модифицировать только с нулевым уровнем привилегий.
