Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

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

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

12.3.1. Численные регистры

Мы будем обозначать численные регистры как ST0 - ST7. Они приведены на следующем рисунке:

80 бит
    ----------------------------------------------------¬
ST0 ¦                                                   ¦
    +---------------------------------------------------+
ST1 ¦                                                   ¦
    +---------------------------------------------------+
ST2 ¦                                                   ¦
    +---------------------------------------------------+
ST3 ¦                                                   ¦
    +---------------------------------------------------+
ST4 ¦                                                   ¦
    +---------------------------------------------------+
ST5 ¦                                                   ¦
    +---------------------------------------------------+
ST6 ¦                                                   ¦
    +---------------------------------------------------+
ST7 ¦                                                   ¦
    L----------------------------------------------------


Численные регистры используются как стек. Регистр состояния в поле ST содержит номер численного регистра, являющего вершиной стека. При выполнении команд в качестве операнда могут выступать численные регистры. В этом случае номер указанного в команде регистра прибавляется к содержимому поля ST регистра состояния и таким образом определяется используемый регистр. Большинство команд после выполнения увеличивают поле ST регистра состояния, как бы записывая результаты своей работы в стек численных регистров.

Вы можете использовать регистры как массив, но в этом случае необходимо заботится о постоянстве поля ST регистра состояния, так как в противном случае номера численных регистров будут изменяться.

12.3.2. Регистр тегов

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

-----T----T----T----T----T----T----T----¬
¦TAG0¦TAG1¦TAG2¦TAG3¦TAG4¦TAG5¦TAG6¦TAG7¦
L----+----+----+----+----+----+----+-----


Поля регистра тегов классифицируют содержимое "своего" численного регистра:

00 регистр содержит действительное ненулевое число;
01 в регистре находится нуль;
10 регистр содержит недействительное число (нечисло, бесконечность, неопределенность);
11 пустой неинициализированный регистр.

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

12.3.3. Регистр управления

Регистр управления для сопроцессора 8087 показан на следующем рисунке:

  15-13   12 11-10  9-8   7   6   5   4   3   2   1  0
---------T-T-----T-----T---T---T---T---T---T---T---T---¬
¦XXXXXXXX¦IC¦ RC  ¦ PC  ¦IEM¦XXX¦PM ¦UM ¦OM ¦ZM ¦DM ¦IM ¦
L--------+--+-----+-----+---+---+---+---+---+---+---+----


Регистр управления сопроцессоров 80287/80387 и сопроцессора, входящего в состав процессора 80486, имеет аналогичный формат, за исключением того, что бит 7 в нем не используется:

  15-13   12 11-10  9-8    7-6    5   4   3   2   1  0
---------T-T-----T-----T--------T---T---T---T---T---T---¬
¦XXXXXXXX¦IC¦ RC  ¦ PC  ¦XXXXXXXX¦PM ¦UM ¦OM ¦ZM ¦DM ¦IM ¦
L--------+--+-----+-----+--------+---+---+---+---+---+----


Биты 0...5 - маски особых случаев. Особые случаи иногда возникают при выполнении команд сопроцессора, например, при делении на нуль, переполнении и т.д. Если все биты масок особых случаев равны нулю, особый случай вызывает прерывание центрального процессора INT 10h (обратите внимание, что это прерывание используется BIOS для работы с дисплейным адаптером). Если же особые случаи замаскированы установкой соответствующих битов в единичное состояние, прерывание не вырабатывается, а в качестве результата возвращается особое значение - бесконечность, нечисло и т.д.

Приведем таблицу масок особых случаев:

IM маска недействительной операции;
DM маска денормализованного результата;
ZM маска деления на нуль;
OM маска переполнения;
UM маска антипереполнения;
PM маска особого случая при неточном результате;
IEM маскирование одновременно всех особых случаев вне зависимости от установки битов 0...5 регистра управления, этот бит действителен только для сопроцессора 8087

Подробнее особые случаи и условия их возникновения будут описаны позже, когда мы займемся ошибками при выполнении команд в сопроцессоре.

Поле PC управляет точностью вычислений в сопроцессоре:

00 использование расширенной точности, этот режим устанавливается при инициализации сопроцессора;
10 округление результата до двойной точности;
00 округление результата до одинарной точности.

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

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

00 округление к ближайшему числу, этот режим устанавливается при инициализации сопроцессора;
01 округление в направлении к отрицательной бесконечности;
10 округление в направлении к положительной бесконечности;
11 округление в направлении к нулю.

На следующих рисунках демонстрируются перечисленные выше режимы округления. Символами "o" обозначены точные значения вещественных чисел, символами "x" приближенные значения. Стрелки "<<" и ">>" указывают направление округления. В центре линии расположен нуль числовой оси, на ее левом и правом конце - отрицательная и положительная бесконечности.

Округление в направлении к ближайшему числу.

-беск.<-o-<<-x-------o---- 0 -----o-----x->>-o---->+беск.

Округление в направлении к отрицательной бесконечности.

-беск.<-o-<<-x-------o---- 0 -----o--<<---x-o---->+беск.

Округление в направлении к положительной бесконечности.

-беск.<-o-x-->>-----o---- 0 -----o------x->>-o---->+беск.

Округление в направлении к нулю.

-беск.<-o-x-->>-----o---- 0 -----o--<<----x-o---->+беск.


Для наибольшего уменьшения ошибок вычислений наиболее целесообразно использовать режим округления в направлении к ближайшему числу. Режим округления в направлении к нулю используется при моделировании целочисленной арифметики.

Остальные два режима округления используют в интервальной арифметике. Для получения наиболее точного результата каждая команда (операция) выполняется два раза - первый раз с округлением в направлении к отрицательной бесконечности, второй раз - в направлении к положительной бесконечности. Точный результат лежит между полученными значениями. Заметьте, что здесь речь идет только об отелных операциях, но не о том, чтобы выполнить всю программу вычислений вначале с одним режимом округления, а затем с другим.

Поле IC регистра управления предназначен для управления бесконечностью:

0       проективный режим;
1       афинный режим.


В проективном режиме существует только одна бесконечность, она не имеет знака:

Бесконечность
-----------------> <-----------------¬
¦                                    ¦
¦                                    ¦
¦                                    ¦
L---------------- 0 ------------------


В афинном режиме имеется две бесконечности - положительная и отрицательная:

-бесконечность                             + бесконечность 
<-------------------------- 0 ---------------------------->


Афинный режим допускает выполнение многих операций с бесконечностями - сложение, умножение и т.д.

12.3.4. Регистр состояния

Поля регистра состояния сопроцессора 8087 показаны на следующем рисунке:

 15 14 13-11 10 9  8  7  6  5  4   3  2  1  0
---T-T-----T-T-T-T-T-T-T---T-T-T-T--¬
¦B ¦C3¦ ST  ¦C2¦C1¦C0¦IR¦XX¦PE¦UE ¦OE¦ZE¦DE¦IE¦
L--+--+-----+--+--+--+--+--+--+---+--+--+--+---



Регистр состояния сопроцессоров 80287/80387 и сопроцессора, входящего в состав процессора 80486, имеет немного другой формат:

 15 14 13-11 10 9  8  7  6  5  4   3  2  1  0
---T--T-----T--T-T-T-T-T--T--T---T---T--T-----¬
¦B ¦C3¦ ST  ¦C2¦C1¦C0¦ES¦XX¦PE¦UE ¦OE¦ZE¦DE¦IE¦
L--+--+-----+--+--+--+--+--+--+---+--+--+--+---


В обоих форматах биты 0...5 - флажки особых случаев. Они устанавливаются всегда при возникновении особых случаев, даже замаскированных установкой в 1 соответствующих битов регистра управления.

Приведем таблицу флажков особых случаев:

IE недействительная операция;
DE денормализованный результат;
ZE деление на нуль;
OE переполнение;
UE антипереполнение;
PE неточный результат.

Для того, чтобы сбросить установившийся флажок, программа должна явным образом установить его в нуль, выполнив команду записи в регистр состояния.

Назначение бита 7 регистра состояния различно для сопроцессора 8087 и сопроцессоров 80287/80387.

Для сопроцессора 8087 этот бит обозначается IR и содержит флаг запроса прерывания при возникновении незамаскированного особого случая. В этом случае флаг устанавливается в 1.

Сопроцессоры 80287/80387 используют бит 7 в качестве флага суммарной ошибки, который устанавливается в 1 при возникновении незамаскированного особого случая.

Биты C0, C1, C2, C3 - это коды условий. Они определяются по результату выполнения команд сравнения и команды нахождения остатка. Мы расскажем о них при описании соответствующих команд сопроцессора.

Поле ST занимает три бита 11...13 и содержит номер численного регистра, являющегося вершиной стека численных регистров.

Бит B - бит занятости. Он устанавливается в 1, когда процессор выполняет команду или когда происходит прерывание от сопроцессора. Если сопроцессор свободен, бит занятости установлен в 0.

12.3.5. Регистры указателя команды и указателя операнда

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

В сопроцессоре 8087 указатель команды содержит 20-разрядный адрес команды, вызвавшей особый случай и код выполняемой в этот момент операции. Адрес команды здесь указывается без учета предшествующих команде префиксов:

---------------------------------------------------¬
¦Адрес команды (0...15)                            ¦
+------------------------T-T-----------------------+
¦Адрес команды (16...19) ¦X¦ Код операции (0...10) ¦
L------------------------+-+------------------------


Сопроцессоры 80287/80387 в реальном режиме работы имеют такой же формат регистра указателя команд, однако этот указатель показывает на первый префикс команды, вызвавшей особый случай.

Защищенный режим работы центрального процессора и сопроцессора выходит за рамки данной книги, однако для полноты изложения приведем формат указателей и для этого режима. В защищенном режиме адрес состоит из селектора (в какой-то степени соответствует сегментной компоненте адреса реального режима) и смещения. Формат указателя команды для защищенного режима представлен на следующем рисунке:

---------------------------------------------------¬
¦                  Смещение команды                ¦
+--------------------------------------------------+
¦                  Селектор команды                ¦
L---------------------------------------------------


Код операции здесь отсутствует, но его легко получить, пользуясь адресом команды.

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

Формат указателя операнда для реального режима:

---------------------------------------------------¬
¦     Адрес операнда (0...15)                      ¦
+-------------------------------T------------------+
¦     Адрес операнда (16...19)  ¦XXXXXXXXXXXXXXXXXX¦
L-------------------------------+-------------------


Формат указателя операнда для защищенного режима:

---------------------------------------------------¬
¦                  Смещение операнда               ¦
+--------------------------------------------------+
¦                  Селектор операнда               ¦
L---------------------------------------------------


[Назад] [Содеожание] [Дальше]