Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 33, М.: Диалог-МИФИ, 1997, 304 стр. Регистры сопроцессораАрифметический сопроцессор содержит восемь численных 80-битовых регистров, предназначенных для хранения промежуточных результатов вычислений, регистра управления, регистра состояния, регистра тегов, регистра указателя команды и регистра указателя операнда. Численные регистрыМы будем обозначать численные регистры как ST0 - ST7. Они приведены на рисунке 10.5. Рис. 10.5. Численные регистры арифметического сопроцессора Численные регистры используются как стек. Регистр состояния в поле ST содержит номер численного регистра, являющего вершиной стека. При выполнении команд в качестве операнда могут выступать численные регистры. В этом случае номер указанного в команде регистра прибавляется к содержимому поля ST регистра состояния и таким образом определяется используемый регистр. Большинство команд после выполнения увеличивают поле ST регистра состояния, как бы записывая результаты своей работы в стек численных регистров. Вы можете использовать регистры как массив, но в этом случае необходимо заботится о постоянстве поля ST регистра состояния, так как в противном случае номера численных регистров будут изменяться. Регистр теговЭтот регистр разделен на восемь двухбитовых полей, которые мы обозначим как TAG0...TAG7. Каждое поле относится к своему численному регистру (рис. 10.6). Рис. 10.6. Формат регистра тегов Поля регистра тегов классифицируют содержимое "своего" численного регистра:
Например, если все регистры сопроцессора были пустые, а затем в стек численных регистров было занесено одно действительное ненулевое значение, содержимое регистра тегов будет 3FFFh. Регистр управленияРегистр управления для сопроцессора 8087 показан на рисунке 10.7. Рис. 10.7. Формат регистра управления для сопроцессора 8087 Регистр управления сопроцессоров 80287/80387 и сопроцессора, входящего в состав более современных процессоров, имеет аналогичный формат, за исключением того, что бит 7 в нем не используется (рис. 10.8). Рис. 10.8. Формат регистра управления для современных сопроцессоов Биты 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 - афинный режим В проективном режиме существует только одна бесконечность, она не имеет знака. В афинном режиме имеется две бесконечности - положительная и отрицательная. Афинный режим допускает выполнение многих операций с бесконечностями - сложение, умножение и так далее. Регистр состоянияПоля регистра состояния сопроцессора 8087 показаны на рисунке 10.9. Рис. 10.9. Формат регистра состояния сопроцессора 8087 Регистр состояния сопроцессоров 80287/80387 и сопроцессора, входящего в состав современных процессоров, имеет немного другой формат. Мы показали его на рис. 10.10. Рис. 10.10. Формат регистра состояния современных сопроцессоров В обоих форматах биты 0-5 - флажки особых случаев. Они устанавливаются всегда при возникновении особых случаев, даже замаскированных установкой в 1 соответствующих битов регистра управления. Приведем таблицу флажков особых случаев:
Для того, чтобы сбросить установившийся флажок, программа должна явным образом установить его в нуль, выполнив команду записи в регистр состояния. Назначение бита 7 регистра состояния различно для сопроцессора 8087 и сопроцессоров 80287/80387. Для сопроцессора 8087 этот бит обозначается IR и содержит флаг запроса прерывания при возникновении незамаскированного особого случая. В этом случае флаг устанавливается в 1. Сопроцессоры 80287/80387 используют бит 7 в качестве флага суммарной ошибки, который устанавливается в 1 при возникновении незамаскированного особого случая. Биты C0, C1, C2, C3 - это коды условий. Они определяются по результату выполнения команд сравнения и команды нахождения остатка. Мы расскажем о них при описании соответствующих команд сопроцессора. Поле ST занимает три бита 11-13 и содержит номер численного регистра, являющегося вершиной стека численных регистров. Бит B - бит занятости. Он устанавливается в 1, когда процессор выполняет команду или когда происходит прерывание от сопроцессора. Если сопроцессор свободен, бит занятости установлен в 0. Регистры указателя команды и указателя операндаРегистры указателя команды и указателя операнда предназначены для обработки особых случаев, возникающих при выполнении команд в сопроцессоре. В сопроцессоре 8087 указатель команды содержит 20-разрядный адрес команды, вызвавшей особый случай и код выполняемой в этот момент операции. Адрес команды здесь указывается без учета предшествующих команде префиксов (рис. 10.11). Рис. 10.11. Указание адреса команды в сопроцессоре 8087 Сопроцессоры 80287/80387 в реальном режиме работы имеют такой же формат регистра указателя команд, однако этот указатель показывает на первый префикс команды, вызвавшей особый случай. Защищенный режим работы центрального процессора и сопроцессора описан в 6 томе «Библиотеки системного программиста». Для полноты изложения приведем формат указателей и для этого режима. В защищенном режиме адрес состоит из селектора и смещения. Формат указателя команды для защищенного режима представлен на рисунке 10.12. Рис. 10.12. Формат указателя команды для защищенного режима Код операции здесь отсутствует, но его легко получить, пользуясь адресом команды. Если при возникновении особого случая использовался операнд, находящийся в оперативной памяти, его адрес записывается в регистр указателя операнда. Приведем форматы этого регистра для реального и защищенного режимов работы. Формат указателя операнда для реального режима представлен на рис. 10.13. Рис. 10.13. Формат указателя операнда для реального режима Формат указателя операнда для защищенного режима мы показали на рис. 10.14. Рис. 10.14. Формат указателя операнда для защищенного режима |