Аппаратное обеспечение 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----+----+----+----+----+----+----+----- Поля регистра тегов классифицируют содержимое
"своего" численного регистра:
Например, если все регистры сопроцессора были пустые, а затем в стек численных регистров было занесено одно действительное ненулевое значение, содержимое регистра тегов будет 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 для работы с дисплейным адаптером). Если же особые случаи замаскированы установкой соответствующих битов в единичное состояние, прерывание не вырабатывается, а в качестве результата возвращается особое значение - бесконечность, нечисло и т.д. Приведем таблицу масок особых случаев:
Подробнее особые случаи и условия их возникновения будут описаны позже, когда мы займемся ошибками при выполнении команд в сопроцессоре. Поле PC управляет точностью вычислений в
сопроцессоре:
Искусственное ухудшение точности вычислений не приводит к ускорению работы программы. Режимы с пониженной точностью предназначены для эмуляции процессоров, использующих двойную и одинарную точность, соответственно. Двух битовое поле RC задает режим округления при
выполнении операций с вещественными числами:
На следующих рисунках демонстрируются перечисленные выше режимы округления. Символами "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 соответствующих битов регистра управления. Приведем таблицу флажков особых случаев:
Для того, чтобы сбросить установившийся флажок, программа должна явным образом установить его в нуль, выполнив команду записи в регистр состояния. Назначение бита 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--------------------------------------------------- |