
- •Тема 6 Математический сопроцессор
- •1. Назначение математического сопроцессора (fpu)
- •2. Набор регистров
- •2.1 Регистры стека сопроцессора
- •2.2 Регистр управления cwr
- •2.3 Регистр состояния swr
- •2.4 Регистр twr
- •2.5 Регистры указатели dpr и ipr
- •2.6 Совместная работа процессора и сопроцессора
- •3. Типы данных сопроцессора
- •3.1 Двоичные целые числа
- •3.2. Упакованные целые двоично-десятичные числа
- •3.3. Вещественные числа
- •3.4 Специальные численные значения
- •4. Система команд сопроцессора
- •4.1 Команды передачи данных
- •4.2 Команды загрузки констант
- •4.3 Команды сравнения данных
- •4.4 Арифметические команды
- •4.5 Команды трансцендентных функций
- •4.6 Команды управления сопроцессором
2.4 Регистр twr
Регистр тегов TWR представляет собой совокупность двухбитовых полей. Каждое поле соответствует определенному физическому регистру стека (см. рисунок 2.1) и характеризует его текущее состояние. Изменение состояния любого из регистров стека сопроцессора отражается на содержимом соответствующего этому регистру поля регистра тега. Возможны следующие значения в полях регистра тега:
00 – регистр стека сопроцессора занят допустимым ненулевым значением;
01 – регистр стека сопроцессора содержит нулевое значение;
10 – регистр стека сопроцессора содержит одно из специальных численных значений (см. ниже), за исключением нуля;
11 – регистр пуст и в него можно производить запись (но это не означает, что все биты соответствующего регистра стека будут нулевыми).
Как уже отмечалось, при написании программы разработчик манипулирует не абсолютными, а относительными номерами регистров стека. По этой причине могут возникнуть трудности при попытке интерпретации содержимого регистра тегов TWR, с соответствующими физическими регистрами стека. В качестве связующего звена необходимо привлекать информацию из поля TOP регистра SWR.
2.5 Регистры указатели dpr и ipr
Два регистра указателей – данных DPR (Data Point Register) и команд IPR (Instruction Point Register) предназначены для запоминания информации об адресе команды, вызвавшей исключительную ситуацию и адресе ее операнда. Эти указатели используются при обработке исключительных ситуаций (но не для всех команд).
2.6 Совместная работа процессора и сопроцессора
Процессор и сопроцессор имеют свои, несовместимые друг с другом системы команд и форматы обрабатываемых данных. Несмотря на то, что сопроцессор архитектурно представляет собой отдельное вычислительное устройство, он не может существовать отдельно от основного процессора. Первые модели процессоров Intel (i8086, i286, i386) и сопроцессоров (соответственно i8087, i287, i387) выполнялись как отдельные устройства – сопроцессор, при необходимости, вставлялся в специальный разъем на системной плате. Начиная с модели i486, сопроцессор и основной процессор производятся в одном корпусе и являются физически неделимыми, то есть архитектурно это по-прежнему два разных устройства, а аппаратно – одно.
Процессор и сопроцессор являются двумя самостоятельными вычислительными устройствами и могут работать параллельно. Но этот параллелизм касается только их внутренней работы над исполнением очередной команды. Как реализован этот параллелизм, в чем его суть и особенности?
Оба устройства подключены к общей системной шине и имеют доступ к одинаковой информации. Основной процессор инициирует процесс выборки очередной команды, которая попадает одновременно в оба процессора. Любая команда сопроцессора имеет код операции, первые пять бит, которого имеют значение 11011. Когда код операции начинается этими битами, то основной процессор по дальнейшему содержимому кода операции выясняет, требует ли команда обращения к памяти. Если это так, то основной процессор формирует физический адрес операнда и обращается к памяти, после чего содержимое ячейки памяти выставляется на шину данных. Если обращение к памяти не требуется, то основной процессор заканчивает работу над данной командой (не делая попытки ее исполнения!) и приступает к декодированию следующей команды из текущего входного командного потока.
Что же касается сопроцессора, то выбранная команда, как уже было отмечено, попадает в него одновременно с основным процессором. Сопроцессор, определив по первым пяти битам, что очередная команда принадлежит его системе команд, начинает ее исполнение. Если команда требовала операнд в памяти, то сопроцессор обращается к шине данных за чтением содержимого ячейки памяти, которое к этому моменту предоставлено основным процессором.
Из этой схемы взаимодействия следует, что в определенных случаях необходимо согласовывать работу обоих устройств. К примеру, если во входном потоке сразу за командой сопроцессора следует команда основного процессора, использующая результаты работы предыдущей команды, то сопроцессор не успеет выполнить свою команду за то время, когда основной процессор, пропустив сопроцессорную команду, выполнит свою. Очевидно, что логика работы программы будет нарушена.
Возможна и другая ситуация. Если входной поток команд содержит последовательность из нескольких команд сопроцессора, то, очевидно, что процессор в отличие от сопроцессора проскочит их очень быстро, чего он не должен делать, так как он обеспечивает внешний интерфейс для сопроцессора. Эти и другие, более сложные, ситуации приводят к необходимости синхронизации между собой работы двух процессоров. В первых моделях микропроцессоров это делалось путем вставки перед или после каждой команды сопроцессора специальной команды wait или fwait. Работа данной команды заключалась в приостановке работы основного процессора до тех пор, пока сопроцессор не закончит работу над последней командой. В моделях микропроцессора начиная с i486 подобная синхронизация выполняется командами wаit/fwait, которые введены в алгоритм работы большинства команд сопроцессора. Но для некоторых команд (команды управления сопроцессором) оставлена возможность выбора между командами с синхронизацией и без нее.