logo
Дубинин Н

2. Регистры процессора

Как видно из табл. 2.2, важной характеристикой МП и процессоров фирмы Intel является разрядность регистров. Начиная с МП Intel 386 и до настоящего времени фирма Intel придерживается 32-разрядной архитектуры IА-32, обеспечивающей программную совместимость х86 различных модификаций ЭВМ, построенных на базе МП Intel 8086 и выше.

Регистры процессора, как сверхбыстродействующая память, предназначены для хранения операндов и команд, сведений о состоянии вычислительного процесса, обмена данными между МП, ОЗУ и портами, организации адресации и взаимодействия между блоками. По выполняемым функциям они подразделяются на пользовательские, системные и регистры сопроцессора [21, 13]. В 16 регистров пользователя (прикладного программиста) включены 8 регистров общего назначения, 6 сегментных регистров, регистр (счетчик) команд и регистр флагов. Определенные буквы в наименованиях регистров несут смысловое значение:

- E (Extended) – расширенный, т.е. 32-битный;

- H (High) – старший байт регистра, разряды (15, 8);

- L (Low) – младший байт, разряды (7, 0).

Описание регистров общего назначения:

- EAX/AX/AL – аккумулятор, регистр для операций ввода/вывода через порты, вместе с DX выступают в качестве неявных операндов в командах умножения и деления; AL – регистр двоично-десятичных операций;

- EBX/BX – регистр для хранения базовых адресов при работе с данными;

- ECX/CX/CL – счетчик, используется при организации циклов;

- EDX/DX/DL – регистр данных, хранит данные по умолчанию, адрес порта при операциях ввода/вывода, используется в командах умножения и деления;

- EBP/BP – указатель базы при работе с данными в стековых структурах;

- ESP/SP – указатель (реверсивный счетчик) стека;

- ESI/SI – адресный регистр – индекс источника;

- EDI/DI – адресный регистр – индекс приемника. Вместе с SI используется в цепочечных инструкциях обработки массивов, хранит смещения (индексы) относительно базы (начала массива).

Сегментные регистры CS, SS, DS, ES, FS, GS используются для сегментной адресации. Регистры FS и GS появились в составе МП, начиная с i386.

Регистр-указатель команд EIP/IP предназначен для определения адреса следующей команды.

Для организации условных переходов в программах и хранения состояний вычислительного процесса предназначен регистр флагов EFLAGS, структура которого приведена на рис. 2.1.

Рис. 2.1. Структура регистра EFLAGS

Флаги состояния при выполнении операций принимают следующие значения:

- CF – флаг переноса. CF = 1, если при выполнении арифметической операции возник перенос в старший разряд или заем из старшего разряда. В разных форматах операций старшим битом может быть 7, 15 или 31;

- PF – флаг паритета (четности). PF = 1, если после выполнения операции в младшем байте имеется четное число единиц, иначе PF = 0;

- AF – флаг вспомогательного переноса. AF = 1 при возникновении переноса в младшей тетраде;

- ZF – флаг нуля. ZF = 1, если в результате выполнения операции результат равен нулю;

- SF – флаг знака. При выполнении арифметических операций в дополнительном коде знак хранится в старшем разряде. В SF копируется старший бит (7, 15 или 31);

- OF – флаг переполнения. OF = 1 при сложении чисел с одинаковыми знаками (при вычитании – с разными), когда знак результата операции не совпадает со знаком любого из операндов;

- IOPL – привилегии I/O. Значение двух битов устанавливается в соответствии с уровнем привилегий (0, 1, 2, 3) задачи, решаемой МП в Р-режиме;

- NT – флажок вложенной задачи. NT = 1 в Р-режиме, при переходе к подпрограмме с помощью команды CALL. Используется командой IRET:

Флаги управления используются для организации вычислительного процесса. Их назначение и наименование:

- TF – режим покомандного выполнения (трассировки). При TF = 1 МП осуществляет пошаговое выполнение команд, иначе – обычный режим;

- IF – прерывание. При IF = 1 допускаются внешние аппаратные прерывания по входу INTR. При IF = 0 МП игнорирует запросы INTR (прерывания запрещены или замаскированы), состояние IF игнорируется по входу NMI немаскируемых внешних и внутренних прерываний;

- DF – направление. При DF = 1 обработка цепочек слева направо и автодекремент (на 1, 2 или 4) регистров (E)SI, (E)DI. При DF = 0 обработка цепочек справа налево и автоинкремент (на 1, 2 или 4) регистров (E)SI, (E)DI;

- RF – возобновление. При RF = 1 можно маскировать особые случаи в режиме отладки программы;

- VM – V-режим. При VM = 1 устанавливается V-режим (режим эмуляции МП 8086). При VM = 0 МП работает в R- или Р-режиме;

- AC – контроль выравнивания. При AC = 1 и AM = 1 в CR0 допускается выравнивание нечетного ФА при обращении к памяти. Используется на уровне привилегий 3;

- VIP, VIF – ожидание и прерывание. Флажки устанавливаются командами Pentium в V-режиме;

- ID – идентификация. Определяет поддержку команды опроса модели МП CPUID.

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

Системные регистры используются системными программистами для организации работы МП в Р- или V-режиме. Все системные регистры 32-разрядные, кроме LDTR и TR, и в i386, i486 и Pentium делятся на регистры Р-режима, управления, отладки и проверки.

К регистрам Р-режима относятся регистры GDTR, IDTR, LDTR и TR, причем LDTR и TR используются как 16-разрядные селекторы.

Регистры Р-режима предназначены для организации сегментной адресации и назначение их рассмотрено в гл.III п.6. Регистр задачи TR используется в многозадачном режиме. Он указывает на сегмент состояния задачи (TSS), в который сначала записывается значение всех пользовательских регистров и системных регистров CR3 и LDTR – контекст предыдущей (выходящей) задачи, а затем по новому значению TR из TSS извлекается контекст загружаемой в МП на выполнение задачи.

К регистрам управления относятся регистры CR0, CR2, CR3 и в i486 зарезервированный CR1. В регистр CR0 в младшие 2 байта включено слово состояния машины (MSW), впервые появившееся в МП 286, в следующих МП расширенное дополнительными информационными битами. Структура CR0 показана на рис. 2.2.

Назначение информационных битов CR0 следующее:

- PE – реальная адресация. При PE = 0 МП работает в режиме реальной адресации. Устанавливается командой загрузки CR0;

- MP – слежение за сопроцессором, при его отсутствии MP = 0;

- EM – эмуляция сопроцессора, при EM = 1 генерируется ситуация 7 (сопроцессор отсутствует);

- TS – задача переключена. TS = 1 при каждом переключении задач;

- ET – тип сопроцессора. ET = 1 при наличии Intel 387 и ET = 0 при наличии Intel 287;

- NE – ошибка сопроцессора. При NE = 1 сообщаются ошибки FPU и возможны прерывания;

- WP – защита записи. При WP = 1 не допускается изменение области памяти пользователя супервизором;

- AM – маска выравнивания. При AM = 0 контроль выравнивания запрещен;

- NW – запрет сквозной записи. При NW = 0 сквозная запись и циклы недействительности разрешены;

- CD – разрешение кэш. При CD = 0 внутренний кэш используется, иначе – нет;

- PG – включение страничной адресации. При PG = 1 страничный механизм включен, иначе – выключен. При страничной адресации, когда бит CR0 (31) = 1, и наличии свопинга в CR2 заносится линейный адрес страницы, отсутствующей в ОЗУ.

Рис. 2.2. Формат регистров управления

Регистр CR3 используется как базовый регистр каталога страниц в i386, i486 и Pentium. В младших разрядах имеет два информационных бита:

- PWT – сквозная запись страниц. При PWT = 1 устанавливается способ сквозной записи, а при PWT = 0 – способ обратной записи;

- PCD – запрет кэширования страниц. При PCD = 1 запрещена загрузка страниц в кэш.

Регистр CR4 используется только в МП Pentium. Имеет следующие информационные биты:

- VME – расширение V-режима. При VME = 1 поддерживаются флаги прерываний VIF и VIP;

- PVI – виртуальное прерывание защищенного режима. При PVI = 1 позволяет выполнять программы уровня привилегий 0 на уровне привилегий 3;

- TSD – разрешение маркера времени. При TSD = 1 допускается выполнение команды RDTSC;

- DE – расширение отладки. При DE = 1 разрешаются точки останова по I/O;

- PSE – расширение размера страниц. При PSE = 1 страницы имеют размер в 4 Мб;

- MCE – контроль машины. При MCE = 1 допускается расширенный контроль.

2.2. Регистры отладки

К регистрам отладки МП i386, i486, Pentium относятся 8 регистров DR0DR7. Регистры DR4, DR5 в этих МП зарезервированы. В регистры DR0DR3 при отладке программ загружаются 4 линейных 32-разрядных адреса однобайтной команды INT 3 (код операции CCh) контрольных точек останова 0, 1, 2, 3. Эта команда временно программно заменяет первый байт кода операции команды, на котором необходимо остановить вычисления для контроля правильности выполнения участка программы. Каждая из контрольных точек описывается отдельно в DR7, а состояние отладки в DR6. Формат регистров DR6 и DR7 показан на рис. 2.3. Информационные разряды DR6 имеют следующее назначение:

B0...B3 – фиксация контрольной точки. Bi=1 (i = 03) при совпадении соответствующего адреса в DR0  DR3 с адресом обрабатываемой команды в устройстве предвыборки команд;

- BD – использование отладочных регистров. При BD = 1 следующая команда будет читать или записывать в один из отладочных регистров;

- BS – пошаговый режим. BS = 1 при трассировке и TF = 1;

- BT – многозадачный режим. BT = 1 при переключении задачи и T = 1 в TSS.

Рис.2.3. Формат регистров отладки DR6 и DR7

Регистр управления отладкой DR7 имеет следующие информационные биты:

- Li/Gi – разрешение локальных и глобальных i-х контрольных точек. При Li = 1 разрешена установка контрольной точки задачи, а при Gi = 1, так же, как и при Li = 1, но для всех задач. При переключении задач Li очищаются;

- LE, GE – контрольные точки данных. При LE = 1 и GE = 1 МП выдает сообщение после завершения соответствующей команды по обработке данных. При переключении задач LE очищается, GE – нет;

- LENi – длина проверяемого интервала памяти для каждой контрольной точки (область остановки, внутри которой условия останова могут сработать).

При <LENi>, равном:

1) <00> – 1 байт;

2) <01> – 2 байта;

3) <10> – не определено;

4) <11> – 4 байта;

- R/Wi – прерывание по типу доступа к памяти, возникает при <R/Wi>, равном

1) <00> – при выполнении команды;

2) <01> – при записи данных;

3) <10> – не определено;

4) <11> – при чтении/записи;

- GD – защита отладчика. При GD = 1 устанавливается защита обращения к регистрам отладки. При вызове процедур отладки GD сбрасывается.

Регистры отладки доступны только в R- и Р-режиме при уровне привилегий 0.

2.3. Регистры проверки

Регистры проверки TR3TR7 предназначены в i386, i486 для тестового контроля КЭШ и буфера TLB в устройстве страничного преобразования. Регистры TR3TR5 используются для проверки кэш-памяти i486 и имеют формат, показанный на рис. 2.4.

Рис. 2.4. Формат регистров проверки TR3  TR5

Регистр данных TR3 позволяет осуществить доступ к 128-разрядным буферам чтения и заполнения кэш. Загрузка TR3 в буфер или чтение двойного слова (ячейки) из буфера в TR3 осуществляется последовательно, и место чтения/записи в буфере определяется состоянием регистра TR5.

Регистр TR4 определяет состояние тестирования кэш. Младшие биты TR4(2, 0) зарезервированы, старшие 21 бит TR4(31, 11) используются для хранения информации о значении тэга. Остальные разряды имеют следующие назначения:

- Дос – биты достоверности, используются при операциях считывания для того множества, к которому производилось обращение;

- LRU – содержит 3 бита LRU при поиске того множества, к которому производилось обращение;

- V – бит верности, при считывании копирует соответствующий бит Дос, при записи становится новым битом достоверности для выбранных направления и множества.

Регистр управления TR5 содержит 7-битное поле SET SEL выбора одной из 128 строк множества, а поле CTL предназначено для задания следующих функций:

- < 00> – запись/считывание в буфер заполнения;

- < 01> – запись в кэш;

- <10> – считывание из кэш;

- <11> – очистка кэш, фиксация всех строк недостоверности.

Поле ENT регистра TR5 управляет выбором направления при записи/считывании в кэш или определяет ячейку при обращении к буферу заполнения в соответствии с хранимой в нем кодовой комбинацией.

Регистры TR6, TR7 используются для тестирования буфера TLB в i386, i486, более подробно рассмотрены в гл.III. п.7.

2.4. Регистры сопроцессора

Сопроцессор – это специализированный математический процессор. Он предназначен для параллельного вычисления арифметических операций с плавающей точкой и разгрузки процессора. Сопроцессоры i87, i287, i387, i487SX устанавливались отдельно от МП на материнской плате для параллельного вычисления специальных функций и длительных арифметических операций с плавающей точкой под управлением МП. В i486 и Pentium сопроцессор включен в структуру МП как устройство с плавающей точкой – FPU. В процессоре Pentium был полностью переконструирован FPU процессора Intel 486, он поддерживает оба стандарта для двоичной арифметики с плавающей точкой IEEE 754 и 854. Для общих команд, включая ADD, MUL и LOAD, были разработаны более быстрые алгоритмы, которые обеспечивают увеличение в скорости как минимум в 3 раза по сравнению с FPU процессора Intel 486. Большинство приложений могут достигнуть пятикратного увеличения в скорости по сравнению с FPU процессора Intel 486 или даже большей производительности при конвейерной обработке.

В состав FPU входит УУ, операционный блок, 8 регистров стека R0  R7, регистры управления CW и состояния SW, регистр тэгов TW, указатель команды IP и указатель данных DP. Структура регистров показана на рис. 2.5.

Рис. 2.5. Регистры сопроцессора

Восемь 80-битных регистров R0R7предназначены для хранения чисел с плавающей точкой в расширенном вещественном формате. Состояние 3-битного поляTOPрегистраSWуказывает на вершину стека. Эта часть регистраSWвыполняет функции реверсивного двоичного счетчика, который при декременте из состояния <000> устанавливается в состояние <111>. При инкременте состояния <111> правый разряд увеличивается на единицу, и устанавливается 3-разрядный код, равный значению поляTOP– <000>. Тем самым вершина стека изменяет свое значение при инкременте циклически.

Если, например, в поле TOPсодержится код <100>, то за вершину стекаST(0) илиSTпринят регистрR4, а низ стекаST(7) будет вR3. При записи в стекR0R7осуществляется декремент поляTOPи передача операнда в низ стека. Так, приST= <100> после записи получимST= <011> и передачу операнда вR3. При чтении из стека осуществляется чтение по адресуST(0), затем инкремент поляTOP. В результате обращение к стеку автоматически изменяет значение указателя стека, который является единственным источником для определения адреса регистра стека. В полеMрегистровR0R7заносится мантисса, знак которой располагается в 79 разряде. В поле Е располагается смещенный порядок числа. Мантисса числа – правильная дробь, нормализована как 1/2|М| < 1, сдвинута в ОЗУ влево на один разряд и хранится без старшей единицы. При приеме операнда в сопроцессор она сдвигается на один разряд вправо так, что старшая цифра1с весом 2-1восстанавливается, размещаясь в 63-м бите разрядной сетки.

Для определения состояния стека предназначен регистр тэгов TW, в котором 2-битные поля TAG (i), где i = 0,1,...,7, определяют соответственно состояния регистров R0R7 Состояние TAG(i) используется для упрощения контроля и правильного обращения к стеку. Так, TAG (3) определяет состояние R3. Поля TAG (i) интерпретируются следующим образом:

- 00 – допустимое ненулевое число;

- 01 – нуль;

- 10 – специальное число (не число, неподдерживаемый формат, бесконечность или денормализованное число);

- 11 – отсутствие данных.

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

- IC (только в i87, i287) – управление бесконечностью. При IC = 0 опускается знак в выражении , а при IC = 1 – аффинная арифметика, знак присутствует в наличии -  и + ;

- RC– округление, 2-битное состояние определяет один из способов округления результата в четырех арифметических операциях;

- PC – точность, применяется совместно с полем RC для изменения точности вычислений;

- IEM (i87) маскирует флаг запроса прерывания IR. При IEM = 1 запрещает генерацию сигнала прерываний при ошибках сопроцессора;

- PM, UM, OM, ZM, DM, IM – маски исключений. Биты, исключающие прерывания на соответствующие ошибки FPU.

Регистр состояния SW имеет в своем составе следующие информационные разряды:

- B (i87, i287) – занятость. B=1 при обработке команд и прерываниях. В = 0, когда сопроцессор свободен;

- TOP – указатель стека;

- C0  C3 – флаги арифметических операций; по аналогии с EFLAGS, С0 = CF, C2 = PF, C3 = ZF. Флаг С1 используется в некоторых командах FPU для определения ошибок. Так, при переполнении С1=0, при антипереполне-нии С1 = 1;

- ES (IR для i87) – суммарная ошибка. ES = 1 при возникновении ошибок FPU. В 8087 IR = 1 характеризует незамаскированную исключительную ситуацию;

- SF (i387, i487, Pentium) – стековая ошибка. При выходе за пределы стека SF = 1, IE = 1, причем при выходе за верхнюю границу С1 = 1, а за нижнюю - С1 = 0;

- PE, UE, OE, ZE, DE, IE – флаги исключительных ситуаций:

- PE – неточный результат;

- UE – антипереполнение;

- OE – переполнение;

- ZE – деление на ноль;

- DE – денормализованный операнд;

- IE – недействительная операция.

Эти флаги устанавливаются операционным блоком FPUпри вычислениях в случае возникновения соответствующей особой ситуации, и при отсутствии маски (PM,UM,OM,ZM,DM,IM) в регистре управленияCW. Содержимое указателя и селектора командIPи указателя и селектора данныхDPиспользуется процедурами обработки особых случаев. В регистрIPсопроцессора МП передает адрес обрабатываемой числовой команды и 11 бит кода операции, а вDP– адрес её операнда.

2.5. Регистры SIMD

В потоковом расширении SIMD используются восемь 128-разрядных регистров общего назначения с прямой адресацией. SIMD-регистры содержат упакованные 128-разрядные данные. Команды SSE обращаются к SIMD-регистрам используя регистровые имена XMM0 и до XMM7 (рис. 2.6). SIMD-регистры могут быть использованы для вычислений над данными; но не могут быть использованы для адресации памяти. Адресация выполняется с помощью определенных в IA режимов адресации и регистров общего назначения (EAX, EBX, ECX, EDX, EBP, ESI, EDI и ESP).

MMX регистры MMX0(63,0)- MMX7(63,0) физически реализованы на стандартных для архитектуры Intel 80-разрядных регистрах данных с плавающей точкой (см. рис. 2.5). Поэтому переход от операций MMX к операциям с плавающей точкой требует запуска команды emms. Но так как SIMD-регистры с плавающей точкой являются отдельным регистровым файлом, то команды MMX и команды с плавающей точкой могут быть смешаны с командами SSE без выполнение специальных инструкций, таких как emms.

Новый регистр контроля/состояния MXCSR используется для маскирования и демаскирования обработки числовых исключительных ситуаций, для определения режима округления, для установки режима сброса в ноль и для просмотра состояния флагов.

Регистры:

Биты:

ХММ0

127

2

1

0

ХММ7

127

2

1

0

Рис. 2.6. SIMD-регистры с плавающей точкой

Регистр состояния и управления используется для установки флагов обнаружения арифметических исключений, флагов режимов обработки арифметических исключений, режима округления, режима flush-to-zero и для просмотра флага состояния [11]. Содержимое этого регистра может быть загружено с помощью инструкций ldmxcsr и fxrstor. На рис. 2.7 показан формат и кодирование полей в регистре MXCSR.

Биты 0-5 содержат 6 флагов, которые служат признаками детектирования арифметических SIMD исключений с плавающей точкой. Если флаг установлен в 1, то обнаружено соответствующее исключение. Эти флаги могут быть очищены инструкцией LDMXCSR записью нулей. Если команда LDMXCSR очищает битовую маску и устанавливает соответствующий бит флага исключения, исключение не будет немедленно сгенерированно. Исключение произойдет только после следующей команды SSE. Расширение SIMD использует только один флаг исключения для каждой исключительной ситуации. В ситуации, когда происходит несколько идентичных исключительных ситуаций при обработке одной команды, соответствующий флаг исключения обновляется и указывает, что хотя бы одно из этих условий произошло. По умолчанию эти флаги сбрасываются.

Rd

(зарезер-вированно)

Рис. 2.7. SIMD регистр состояния и управления MXCSR

Биты 7-12 (поле маскирования исключений) определяют, как обрабатываются обнаруженные исключения. Если флаг установлен, то соответствующее исключение маскировано и обрабатывается процессором, который формирует приемлемый результат (в соответствии с процедурой, установленной по умолчанию) и продолжает выполнение программы. Если флаг сброшен, то вызывается программный обработчик для этого исключения. По умолчанию флаги устанавливаются в 1.

Биты 13-14 (RC) устанавливают режим округления результатов при выполнении SIMD-команд над данными с плавающей точкой. По умолчанию устанавливается режим округление до ближайшего. Поле управления округлением (RC) регистра MXCSR (биты 13 и 14) определяет четыре режима округления: округление до ближайшего (биты 0 и 0), до меньшего или равного (0 и 1), до большего или равного (1 и 0) и в сторону нуля (1 и 1). Округление по умолчанию до ближайшего обеспечивает наиболее точную и статистически несмещенную оценку правильного результата. Режимы округления до большего и меньшого называются округлением по направлению и могут быть использованы для реализации интервальной арифметики. Для определения верхней и нижней границы точного решения в многошаговых вычислениях, когда промежуточный результат вычислений округляется. Режим округления в сторону нуля обычно используется при вычислении целых.

Бит 15 (FZ) по умолчанию установлен в 0. Флаг FZ регистра MXCSR включает режим flush-to-zero, когда произошло исчезновение порядка и бит установлен в 1. Тогда процессор выполняет следующие действия:

- возвращает нулевое значение в качестве результата, присваивая ему знак истинного результата;

- устанавливает в 1 биты 4 и 5 регистра MXCSR (флаги обнаружения исключений исчезновения порядка и неточного результата).

Указанные действия выполняются в том случае, если исключение исчезновения порядка маскировано (бит 11 регистра MXCSR установлен в 1). При таком режиме увеличивается скорость работы программ, в которых часто происходит исчезновение порядка результата. Достигается это, однако, ценой снижения точности вычислений.

Остальные биты регистра MXCSR (биты 16-31 и бит 6) зарезервированы и установлены в 0.