logo
Методичка

2.1.1 Основные регистры

На рисунке 2.1 изображена структура основных регистров и их названия. Существует 8 регистров общего назначения (РОН), 6 сегментных регистров, регистр флагов, регистр указателя команд, а также системные регистры, регистры отладки и тестирования.

Регистры общего назначения (РОНы). Эти регистры используются в основном для выполнения арифметических операций и пересылки данных. К каждому РОНу можно обратиться как к 32-разрядному или как к 16-разрядному регистру. К некоторым регистрам можно обращаться как к 8-разрядным. Например, регистр ЕАХ является 32-разрядным, однако его младшие 16-разрядов называются регистром АХ. Старшие 8-разрядов регистра АХ называются АН, а младшие 8-разрядов – AL. 16-разрядные части индексных регистров и регистров-указателей обычно используются только при написании программ для реального режима адресации, т.е. для MS-DOS или её эмуляции в Windows.

Значение аббревиатур имён регистров:

Префикс E в начале имён регистров – expanded (расширенный).

Постфикс X в конце имён регистров означает, собственно, регистр.

AX – Accumulator (накопитель).

BX – Base register (регистр базы).

CX – Counter (счётчик).

DX – Data (данные).

AL – Accumulator low (младшая половина регистра AX).

AH – Accumulator high (старшая половина регистра AX).

BL – Base low (младшая половина регистра BX).

BH – Base high (старшая половина регистра BX).

CL – Counter low (младшая половина регистра CX).

CH – Counter high (старшая половина регистра CX).

DL – Data low (младшая половина регистра DX).

DH – Data high (старшая половина регистра DX).

SI – Source index (индекс источника). Содержит текущий адрес источника.

DI – Destination index (индекс получателя). Содержит текущий адрес приемника.

BP – Base pointer (указатель базы). Для произвольного доступа к данным внутри стека

SP – Stack pointer (указатель стека). Содержит указатель вершины стека.

CS – Code segment (сегмент кода).

DS – Data segment (сегмент данных).

ES – Extra Data segment (дополнительный сегмент данных).

FS – Extended Data segment (дополнительный сегмент данных).

GS – Extended Data segment (дополнительный сегмент данных).

SS – Stack segment (сегмент стека).

IP – Instruction pointer (указатель команд или счётчик команд).

F – Flags (регистр флагов).

GDTR – Global descriptor table register (регистр глобальной таблицы дескрипторов).

IDTR – Interruption descriptor table register (регистр таблицы дескрипторов прерываний).

TR – Task register (регистр задач).

LDTR – Local descriptor table register (регистр локальной таблицы дескрипторов).

DR – Debug register (регистр отладки).

TR – Test register (регистр тестирования).

CR – Control register (управляющий регистр).

Особенности использования регистров. При выполнении команд процессором часть регистров общего назначения имеют специальное предназначение.

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

Сегментные регистры загружаются селекторами сегментов, которые являются смещениями либо глобальной таблицы дескрипторов (GDT – Global Descriptor Table), либо локальной таблицы дескрипторов (LDT – Local Descriptor Table).

Биты сегментных регистров содержат следующую информацию:

0 – 1. RPL – Requested Privilege Level. Уровень запрашиваемых привилегий.

2. TI – Table Indicator. Бит таблицы индикаторов. Указывает процессору где искать указанный селектор. Если бит установлен, то процессор читает селектор из таблицы локальных дескрипторов. Если бит сброшен, то процессор читает селектор из таблицы глобальных дескрипторов.

3 – 15. В этих битах хранится индекс глобальной или локальной таблицы дескрипторов.

Регистр CS слишком мал для хранения сегмента кода, поэтому он должен быть установлен на исполнимый сегмент. Регистр SS слишком мал для хранения сегмента стека, поэтому он должен быть установлен на разрешённый по записи сегмент данных.

Уровень привилегий, установленный в сегментный регистр CS является уровнем привилегий запущенной программы, и называется текущим уровнем привилегий (CPL – Current privilege level). Сегментные регистры DS, ES, FS, GS предназначены для данных и должны быть установлены на сегмент данных с разрешением записи. Уровни привилегий, требуемые каждым из этих селекторов, должен быть больше, чем текущий уровень привилегий CPL.

С каждым из шести сегментных регистров связаны теневые регистры дескрипторов. В теневые регистры в защищённом режиме переписываются 32-разрядный базовый адрес сегмента, 20-разрядный предел и атрибуты (права доступа) из дескрипторных таблиц.

Регистр указателя команд. В регистре EIP хранится смещение относительно начала программы (offset) следующей выполняемой команды. В процессоре есть несколько команд, которые влияют на содержимое этого регистра. Изменение адреса, хранящегося в регистре ЕIP, вызывает передачу управления на новый участок программы.

Регистр флагов EF (EFLAGZ). Биты этого регистра называются флагами и отвечают либо за особенности выполнения некоторых команд CPU, либо отражают результат выполнения команд блоком ALU. Флаги регистра перечислены в таблице 2.1. Биты с 22 по 31 включительно – зарезервированы.

Таблица 2.1 Регистр флагов

21

20

19

18

17

16

15

14

13-12

11

10

9

8

7

6

5

4

3

2

1

0

ID

VIP

VIF

AC

VM

RF

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

PF

1

CF

Для анализа битов этого регистра предусмотрены специальные команды процессора. Говорят, что флаг установлен, когда бит флага равен 1, и что флаг сброшен, когда значение его бита равно 0. Кроме этого расширенный регистр EF по сравнению с регистром F содержит пять новых флагов.

Управляющие флаги. Состояние битов регистра EFLAGS, соответствующих управляющим флагам, программист может изменить с помощью специальных команд процессора. Эти флаги (DF, IF,TF) управляют процессом выполнения некоторых команд CPU:

8. TF – Trap flag. Флаг трассировки (пошагового режима). При его установке (TF=1) после выполнения каждой команды вызывается внутреннее прерывание INT 1, которое останавливает вычислительный процесс, давая возможность проверить содержимое регистров.

9. IF – Interrupt-enable flag. Флаг разрешения прерывания. При IF=1 разрешается выполнение маскированных аппаратных прерываний. При IF=0 – запрещается.

10. DF – Direction flag. Флаг управления направлением обработки массивов в строковых командах. При DF=1 индексные регистры SI, DI, которые принимают участие в строковых командах, автоматически декрементируются на количество байт операнда, осуществляя тем самым обработку строк с конца в начало. При DF=0 – инкрементируются, осуществляя обработку с начала в конец строки.

Флаги состояния. Эти флаги отражают различные признаки результата выполнения арифметических и логических команды CPU:

0. CF – Carry flag. Флаг переноса устанавливается в случае, если при выполнении беззнаковой арифметической операции получается число, разрядность которого превышает разрядность выделенного для него поля результата. В командах сдвига флаг CF фиксирует значение старшего бита.

2. PF – Parity flag. Флаг четности/паритета устанавливается при чётном количестве единиц в результате.

4. AF – Auxiliary Carry. Флаг дополнительного переноса/заёма из младшей тетрады в старшую (из третьего в четвёртый разряд). Используется в командах обработки 8-битных данных, чаще всего – двоично-десятичных чисел.

6. ZF – Zero flag. Флаг нуля устанавливается, если при выполнении арифметической или логической операции получается число, равное нулю (т.е. все биты результата равны 0).

7. SF – Sign flag. Флаг знака дублирует значение старшего бита результата. SF=0 для положительного результата, SF=1 для отрицательного.

11. OF – Overflow flag. Флаг переполнения, или) устанавливается в случае, если при выполнении арифметической операции со знаком получается число, разрядность которого превышает разрядность выделенного для него поля результата.

Флаги, добавленные в регистр EF:

12-13. IOPL – I/O Privilege Level. Флаг уровня привилегий ввода-вывода. Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи.

14. NT – Nested task flag. Флаг вложенности задачи. Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую.

16. RF – Resume flag. Флаг возобновления. В режиме отладки единичное значение RF позволяет осуществить рестарт команды после прерываний. Используется совместно с регистрами точек отладочного останова.

17. VM – Virtual Mode flag. Флаг виртуального режима. Признак работы микропроцессора в режиме виртуального 8086. 1 – процессор работает в режиме виртуального 8086; 0 – процессор работает в реальном или защищенном режиме.

18. AC – Alignment Check. Флаг режима работы процессора, при котором происходит контроль выравнивания. Используется только на уровне привилегий 3. Если AC=1 и AM=1 (AM – бит в регистре управления CR0), то в случае обращения к операнду, не выровненному по соответствующему пределу (2 или 4 или 8) байт, будет вызвано исключение 17. Выравнивание операнда по пределам 2,4,8 означает, что адрес операнда кратен соответственно 2,4,8.

19. VIF – Virtual Interrupt Flag. Флаг разрешения прерывания в виртуальном режиме работы процессора.

20. VIP – Virtual Interrupt Pending. Флаг задержки прерывания в виртуальном режиме работы процессора.

21. ID – CPU Identification. Флаг идентификации процессора. Флаг может быть изменён, если процессор поддерживает команду CPUID.

В управляющих регистрах CR0-CR3 хранятся признаки состояния процессора, общие для всех задач. Регистр CR0 имеет следующие биты:

0. PE – Protection Enable. Флаг защищённого режима. Если PE=1, то режим работы процессора – защищённый.

1. MP – Mathematic present. Флаг наличия математического сопроцессора. Если MP=1, то математический сопроцессор присутствует.

2. EM – Emulate Numeric Extension. Флаг эмуляции команд над числами с плавающей запятой. Когда флаг установлен, то команды для работы с вещественными числами могут быть эмулированы программно.

3. TS – Task Switched. Флаг переключения задач. Флаг устанавливается после того, как задача переключена.

4. ET – Extension Type. Флаг типа расширения. Устанавливается, если присутствует арифметический сопроцессор 387 и выше.

5. NE – Numeric Error Enable. Флаг разрешения ошибки сопроцессора. Если флаг установлен, то в случае ошибки в сопроцессоре генерируется исключительная ситуация 16.

16. WP – Write Protect. Флаг защиты от записи. Если флаг установлен, то ядру операционной системы назначаются страницы памяти в режиме read-only (только чтение).

18. AM – Alignment Mask. Флаг маскирования выравнивания. Когда флаг установлен, то в случае обращения к невыровненным операндам будет генерироваться исключительная ситуация 17. Если флаг сброшен, то такая исключительная ситуация маскируется.

29. NW – Not Write-Through. Флаг запрета сквозной записи.

30. CD – Cache Disable. Флаг запрета кэширования.

31. PG – Paging Enable. Флаг режима страничной организации памяти. Когда флаг установлен, операционная система работает в режиме страничной организации памяти.

Остальные биты регистра CR0 зарезервированы.

Регистр CR1 зарезервирован. В регистре CR2 хранится 32-разрядный линейный адрес, по которому получен отказ страницы памяти. В 20 старших разрядах регистра CR3 хранится физический базовый адрес таблицы каталога страниц и биты управления кэш-памятью. Регистр CR4 содержит биты разрешения архитектурных расширений МП. В целом, эти регистры используются в системном программировании и устанавливают режим работы процессора (нормальный, защищенный и т.д.), постраничное распределение памяти и т.д.

Системные адресные регистры. В системных регистрах-указателях глобальной дескрипторной таблицы GDTR и таблицы прерываний IDTR хранятся 32-разрядные базовые адреса и 16-разрядные пределы таблиц соответственно. Системные сегментные регистры задач TR и локальной дескрипторной таблицы LDTR являются 16-разрядными селекторами. Им соответствуют теневые регистры дескрипторов, которые содержат 32-разрядный базовый адрес сегмента, 20-разрядный предел и байт права доступа.

В регистрах отладки DR0-DR3 содержатся 32-разрядные адреса точек останова в режиме отладки; DR4–DR5 зарезервированы и не используются; DR6 отображает состояние контрольной точки; DR7 – руководит размещением в программе контрольных точек.

Регистры тестирования TR входят в группу модельно-специфических регистров, их состав и количество зависят от типа процессора: в МП 386 используются два регистра TR6 и TR7 для контроля постраничной системы распределения памяти операционной системой. В Pentium II и выше используется двенадцать регистров TR1–TR12. Эта группа регистров содержит также результаты тестирования МП и кэш-памяти.