Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / 3ProcArch.doc
Скачиваний:
34
Добавлен:
20.06.2014
Размер:
1.23 Mб
Скачать

Расширенные регистры и типы данных процессоров 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

Команды общего назначения делятся на следующие подгруппы:

  1. Команды передачи данных.

  2. Команды целочисленной двоичной арифметики.

  3. Команды десятичной арифметики.

  4. Команды логических операций.

  5. Команды сдвига.

  6. Команды битовых и байтовых операций.

  7. Команды передачи управления.

  8. Команды строковых операций.

  9. Команды ввода-вывода.

  10. Команды управления флагами.

  11. Команды операций над сегментными регистрами.

  12. Другие команды.

СИСТЕМНАЯ АРХИТЕКТУРА ПРОЦЕССОРОВ IA-32 и Intel64

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

Системные задачи

Системная архитектура (рис.) включает в себя множество регистров, структур данных и команд, предназначенных для выполнения следующих задач:

  • управления памятью;

  • защиты программных модулей;

  • реализации многозадачности;

  • реализации многопроцессорности;

  • обработки исключений и прерываний;

  • управления кэш-памятью;

  • управления питанием;

  • управления аппаратными средствами;

  • отладки и мониторинга производительности.

Системная архитектура неразрывно связана с защищенным режимом, поскольку все ее особенности проявляются только в нем. В реальном режиме процессоры x86 выглядят как i8086, только с регистрами общего назначения большего размера.

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

Рис. Системные регистры и структуры данных

процессоров Intel64 в режиме IA-32e

Основные структуры данных защищенного режима

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

  1. Селектор сегмента — 16-битная структура данных, содержащая индекс (номер) дескриптора сегмента в указанной таблице, текущий или запрашиваемый уровень привилегий. Для доступа к сегменту селектор должен быть загружен в соответствующий сегментный регистр.

  2. Дескриптор сегмента — 8- или 16-байтная структура данных, содержащая базовый адрес (адрес начала) сегмента, лимит (предел) сегмента, другую необходимую информацию о сегменте. Дескриптор содержится в другой структуре — таблице дескрипторов, находящейся в памяти. При обращении к сегменту по его селектору дескриптор сегмента автоматически загружается в скрытую часть сегментного регистра.

  3. Специальный дескриптор — дескриптор шлюза, специальной структуры, предназначенной для перехода между участками кода с различными свойствами.

  4. Таблица страниц — структура, содержащая указатели на страницы.

  5. Каталог страниц — структура, содержащая указатели на таблицы страницы.

  6. Таблица указателей на каталоги страниц и т. д.

Существуют различные типы дескрипторов и таблиц дескрипторов.

Системные регистры IA-32

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

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

  • 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, сегмента состояния задачи) текущей задачи.

  1. Регистры управления (Control Register, CR), пять 32-разрядных регистров: CR0, CR1, CR2, CR3, CR4. Содержат различные поля и флаги для управления процессором на системном уровне. В частности, бит 0 (PE, Protected mode Enable) регистра CR0 при установке в 1 переводит процессор в защищенный режим работы.

  2. Отладочные регистры (Debug Register, DR), восемь 32-разрядных регистров: DR0-DR7. Позволяют отлаживать программу, определяя точки останова, не модифицируя код программ.

  3. Машинно-специфичные регистры. Их число и назначение зависит от модели процессора. Например, в 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 можно модифицировать только с нулевым уровнем привилегий.

Соседние файлы в папке Лекции