Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

FSTCW CrtlReg ; чтение управляющего регистра




FSTCW CrtlReg     ; чтение управляющего регистра

AND CrtlReg, 0F3FH; наложение маски

CMP CtrlReg, 033FH; сравнение значений

JNZ None

. . .                            ; сопроцессор присутствует

None:

. . .                            ; сопроцессор отсутствует

    Все команды сопроцессора имеют мнемонические обозначения, начинающиеся с буквы ‘F’. Коды этих команд состоят из специального префикса и непосредственно самого кода команды. При выполнении программы центральный процессор, встретив префикс команды сопроцессора, передает саму команду на выполнение сопроцессору. Перед выполнением очередной команды сопроцессора необходимо выполнить команду центрального процессора WAIT, которая синхронизирует работу центрального процессора и сопроцессора. Команда WAIT не имеет операндов. Для процессоров, которые уже содержат сопроцессор, команду WAIT можно не использовать. При написании программы команду WAIT можно не ставить, так как транслятор Turbo Assembler автоматически вставляет ее после каждой команды сопроцессора.

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

    Программисту доступны восемь регистров общего назначения сопроцессора, имеющих мнемонические обозначения ST(0) – ST(7), и пять нечисловых регистров. Десятибайтовые регистры ST(0) – ST(7) используются как стек, они предназначены для хранения операндов и результатов арифметических операций. Первый из этих регистров ST(0) можно обозначать в командах просто как ST.

Регистр ST(0) соответствует тому физическому регистру сопроцессора, который является вершиной стека, регистр ST(1) – следующему после вершины регистру и т. д. Таким образом, при обращении к регистру ST(0) происходит обращение к вершине стека сопроцессора. Направление роста стека определяет, что при записи в стек очередного значения, указатель стека уменьшается, а при выталкивании из стека очередного значения – увеличивается. При этом если указатель стека доходит до 0, то при его уменьшении в нем устанавливается значение 7. Если же указатель стека доходит до 7, то при его увеличении в нем устанавливается значение 0. Таким образом, стек сопроцессора представляет собой кольцевой буфер.

    При выполнении команд сопроцессора в стек (регистры ST(0) – ST(7)) заносятся операнды. После выполнения команды эти операнды могут выталкиваться из стека, а в стек заносится результат выполнения арифметической операции. Арифметические операции берут свои операнды с вершины стека и помещают результат в вершину стека. Рассмотрим, например, действие команды сложения вещественных чисел FADD. Эта команда имеет два операнда, которые берутся из вершины стека – из регистров ST(0) и ST(1). Результат выполнения команды FADD записывается в вершину стека в регистр ST(0).

Существуют специальные команды сопроцессора, которые загружают регистры ST(0) – ST(7) значениями, взятыми из ячеек памяти. Другие команды наоборот извлекают из регистров ST(0) – ST(7) значения и записывают их в ячейки памяти. При выполнении этих команд автоматически выполняются преобразования типов операндов. Например, можно из ячейки памяти с целочисленным значением записать это значение в вершину стека и при этом будет выполнено преобразование целочисленного значения в вещественное. И наоборот, при записи значения из регистров ST(0) – ST(7) в память может выполняться преобразование вещественного значения в целочисленное.

    Нечисловые регистры сопроцессора предназначены для хранения состояния сопроцессора и признаков значений регистров ST(0) – ST(7). Нечисловыми регистрами являются: регистр управления; регистр состояния; регистр признаков; указатель команды; указатель операнда.

Структура нечисловых регистров сопроцессора представлена ниже (символами ‘X’ обозначены неопределенные значения битов для некоторых моделей сопроцессоров).

15 – 13 11 – 10 9 - 8
XXX XX RC PC XX XX PM UM OM ZM DM I M

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

13 – 11
B C3 ST C2 C1 C0 ES SF PE UE OE Z E DE I E

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

 

 

15 – 14 13 – 12 11 – 10 9 – 8 7 – 6 5 – 4 3 – 2 1 – 0
TAG0 TAG1 TAG2 TAG3 TAG4 TAG5 TAG6 TAG7

Регистр признаков

Код операции

X

Адрес команды

           

Указатель команды

XXXXXXXXXXXX

Адрес операнда

Указатель операнда

 

Регистр управления. Биты 0 – 5 для всех сопроцессоров являются масками недействительных состояний. Если бит маски для какого-либо недействительного состояния, например переполнения – сброшен, то возникновение этого состояния вызывает прерывание центрального процессора. Если этот бит установлен, то прерывание не вырабатывается, а в качестве результата формируется особое значение (в рассматриваемом случае код бесконечности). Используются следующие маски особых случаев:

    IM (Invalid Operation Mask) – маска недействительной операции;

    DM (Denormalized Operand Mask) – маска денормализованного операнда;

    ZM (Zero Divide Mask) – маска деления на нуль;

    OM (Overflow Mask) – маска переполнения;

    UM (Underflow Mask) – маска антипереполнения;

    PM (Precision Mask) – маска особого случая при неточном результате.

В сопроцессорах 80287 и выше поля в битах 6 и 7 не используются. В сопроцессоре 8087 в поле 7 содержится маска недействительных прерываний IEM (Interrupt Enable Mask). Если IEM = 0, то прерывания центрального процессора не будет даже при возникновении незамаскированной ошибки.

    Содержимое поля PC (Precision Control, биты 8 и 9) определяет точность вычислений в сопроцессоре:

    11B – используется расширенная точность;

    10B – результат округляется до двойной точности;

    00B – результат округляется до одинарной точности.

    Двухбитовое поле RC (Rounding Control, биты 10 и 11) определяет режим округления при выполнении операций с вещественными числами:

    00B – производится округление к ближайшему представимому числу. Этот режим устанавливается при инициализации сопроцессора;

    01B – производится округление в направлении к отрицательной бесконечности;

    10B – производится округление в направлении к положительной бесконечности;

    11B – производится округление в направлении к нулю.

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

Регистр состояния. Биты 0 – 5 для всех сопроцессоров являются признаками (флагами) особых случаев Они устанавливаются при возникновении следующих ошибок:

    IE (Invalid Operation) – недействительная операция;

    DE (Denormalized Operand) – денормализованный операнд;

    ZE (Zero Divide) – деление на нуль;

    OE (Overflow) – переполнение;

    UE (Underflow Mask) – антипереполнение;

    PE (Precision Mask) – потеря точности.

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

    Бит 6 содержит флаг ошибки стека SF (Stack Fault). Этот флаг устанавливается сопроцессором при возникновении переполнения или антипереполнения стека. Переполнение стека возникает в том случае, если стек полностью заполнен при попытке записи в него очередного значения. Антипереполнение стека возникает в том случае, если при попытке вытолкнуть значение из стека он оказывается пустым. Флаг SF сбрасывается только при непосредственной записи значения в регистр состояния.

    Бит 7 содержит флаг суммарной ошибки ES (Summary Error), который устанавливается при возникновении любого незамаскированного особого случая, т. е. установке любого из битов 0 – 5 регистра состояния. Это справедливо для сопроцессоров 80287 и выше. Для сопроцессора 8087 бит 7 содержит флаг IR (Interrupt Request) запроса прерывания при возникновении незамаскированного особого случая.

    Биты C0, C1, C2 и C3 (Condition Code) – коды условий. Они устанавливаются по результатам выполнения команд сравнения и команд нахождения остатка.

    В поле ST (Stack Pointer) содержится номер числового физического регистра, являющегося вершиной стека.     

Бит занятости B (Busy) устанавливается, если сопроцессор выполняет команду или происходит прерывание от основного процессора. Если сопроцессор свободен, то бит занятости сбрасывается.

    При инициализации сопроцессора все флаги, за исключением ST и ES (значения которых не определены) сбрасываются.

Регистр признаков. Регистр признаков содержит восемь 2-х битовых полей TAG0 – TAG7. Содержимое каждого поля характеризует значение соответствующего числового регистра ST(0) – ST(7). По содержимому полей TAG0 – TAG7 можно судить о том, какое число хранится в регистрах ST(0) – ST(7). Возможны следующие значения каждого поля TAG0 – TAG7:

    00B – в числовом регистре находится действительное ненулевое число;

    01B – в числовом регистре находится нуль;

    10B – числовой регистр содержит недействительное число – бесконечность, специальное нечисловое значение NaN (Not a Number) или денормализованное число.

    11B – числовой регистр пуст.

Если регистр не отмечен как пустой, то при попытке записи в него вырабатывается код недействительной операции (устанавливается бит 0 регистра состояния) и запись в стек не производится. Этот особый случай может быть замаскирован, и тогда запись будет произведена. Для этого нужно установить бит 0 регистра управления, иначе возникновение особого случая вызовет прерывание центрального процессора.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...