Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

33. Слово стану sw і слово керування cw пристрою fpu.

FPU має два програмно доступних 16-бітових регістри, вміст яких визначає його режими роботи і поточний стан.

15 12 11 10 9 8 7 6 5 4 3 2 1 0

X

X

X

X

RC

PC

X X

PM

UM

OM

ZM

DM

IM



CW

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

B

C3

T O P

C2

C1

C0

ES

SF

PE

UE

OE

ZE

DE

IE

SW

CW – визначає для FPU один з можливих варіантів обробки числових даних. Для кожного варіанту програміст задає маскування особливих випадків, точність обчислень, спосіб заокруглення результатів.

Маски особливих випадків – шість молодших бітів CW:

PM (Precision Mask) – маска точності;

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

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

ZM (divide by Zero Mask) – маска ділення на нуль;

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

IM (Invalid operation Mask) – маска недійсної операції.

Якщо будь-який з цих бітів дорівнює 1, то виникнення особливого випадку не буде викликати переривання процесора (особливий випадок замаскований), а якщо біт містить 0 – FPU активно сигналізує про особливий випадок. Що математично бажано було б одержати в особливому випадку?

Денормалізований операнд – продовжити виконання операції як звичайно;

Ділення на нуль (дільник нуль, а ділене не нуль і не безмежність) – повернути як результат операції безмежність з правильним знаком;

Переповнення – повернути як результат операції найбільше скінченне число або безмежність;

Антипереповнення – повернути денормалізоване число або нуль;

Точність – продовжити операцію як звичайно;

Недійсна операція – найважчий особливий випадок: сюди відносяться всі решта особливих випадків, не виявлених у попередніх випадках і свідчать, як правило, про серйозну помилку в програмі. Без аналізу послідовності кроків, які призвели до одержаної ситуації, неможливо прийти до певного прийнятного висновку. Це відноситься до множення і ділення безмежностей, множення безмежності на нуль, додавання безмежностей з різними знаками, добування квадратного кореня з від’ємного числа, будь-якої операції з не числом, завантаження в не порожній регістр, читання з порожнього регістра і т. д. Найкраще, що можна зробити у випадку “недійсна операція”, це повернути “тихе не число” або цілочислову або десяткову невизначеність. Отже, після виникнення не числа воно не зникає, а поширюється в подальших обчисленнях.

Виявлення особливих випадків: “недійсна операція”, “ділення на нуль”, “денормалізований операнд” відбувається до виконання операції, а решта особливих випадків реєструється тільки після обчислення істинного результату. Якщо виник “ранній” особливий випадок, стек і ОП ще не були модифіковані і містять такі дані, ніби винна команда не виконувалась. Якщо виявиться пізній особливий випадок, то вміст стеку і ОП змінено.

Виникнення особливого випадку відзначається встановленням в 1 відповідного прапорця в слові стану SW, а також біта сумарної помилки es. Видається активний сигнал FERR# помилки з плаваючою крапкою. Далі FPU перевіряє маску в CW і визначає, або потрібно тільки зареєструвати особливий випадок (маска дорівнює 1), або повідомити про це процесор як порушення пристрою FPU (переривання 16) з подальшим викликом обробника даного переривання.

Масковані реакції FPU такі, як ми сказали про них вище – найбільш природні математичні результати. Ці результати можуть брати участь у подальших обчисленнях за винятком особливого випадку – недійсна операція, коли повертається не число. Тому у більшості прикладних програм рекомендується маскувати всі особливі ситуації крім “недійсна операція”.

В FPU такий пріоритет особливих випадків (у порядку спадання): недійсна операція, денормалізований операнд, ділення на нуль, переповнення, антипереповнення, точність.

Керування точністю. Двобітове поле PC (Precision Control) визначає точність обчислень: 24 біти (PC=00), 53 біти (PC=10) і 64 біти (PC=11). За замовчуванням (домовленістю) PC=11. Якщо вибрана менша точність, заокруглення дробового значення зануляє не використовувані праві біти. Керування точністю впливає тільки на команди: fadd, fsub, fmul, fdiv, fsqrt.

Керування заокругленням. Заокруглення появляється в арифметичних операціях і при збереженні, коли формат приймача не дозволяє зберегти безмежно точний істинний результат. Наприклад, дійсне число заокруглюється, якщо воно зберігається в більш короткому дійсному форматі або цілочисловому форматі. Заокруглення вносить похибку, величина якої в будь-якому режимі заокруглення не перевищує одиниці молодшого розряду, який зберігається в результаті.

FPU має чотири режими заокруглення, які вибираються на основі поля RC регістра CW. FPU у випадку неточного результату вибирає два числа, які точно зображуються в ОП і і найближчі до (). Після цього процесор заокруглює (замінює на або у відповідності з режимом заокруглення):

Поле RC

Режим заокруглення

Дія заокруглення

00

Заокруглення д найближчого

або , найближче до ; при рівності, вибрати парне число

01

Заокруглення до (вниз)

10

Заокруглення до (вгору)

11

Зрізання до нуля

відкинути дробову частину

За замовчуванням заокруглення до найближчого, найточніша і незміщена оцінка результату (не більше половини наймолодшого розряду. Похибка знакозмінна, тому оцінка незміщена).

Зрізання до нуля використовується для цілочислової арифметики.

Заокруглення вгору і вниз називається направленим заокругленням і застосовується в інтервальній арифметиці (один раз вгору, один раз вниз для обчислення верхньої і нижньої меж багатоетапного обчислення).

RC впливає тільки на арифметичні операції.

Біт 12=IC FPU ігнорує. В процесорах 8086 і 80286 цей біт керує інтерпретацією безмежності: проективна (IC=0) або афінна (IC=1). FPU підтримує тільки афінний режим.

Слово стану SW – відображує загальний стан FPU. Його можна зберегти командами: fstsw/fnstsw – збереження слова стану, fstenv/fnstenv – збереження середовища, fsave/fnsave – збереження повного стану або передати в регістр ax командами fstsw ax/fnstsw ax для подальшого аналізу цілочисловим пристроєм.

У sw молодші шість бітів відведені для реєстрації особливих випадків. Прапорці особливих випадків позначаються так:

PE (Precision Error) – помилка точності;

UE (Underflow Error) – помилка антипереповнення;

OE (Overflow Error) – помилка переповнення;

ZE (divide by Zero Error) – помилка ділення на нуль;

DE (Denormalised Error) – помилка ненормалізованого операнда;

IE (Invalid Error) – помилка недійсної операції.

Якщо виникає будь-який з незамаскованих особливих випадків, то FPU установлює в 1 відповідний прапорець і сформує активний вихідний сигнал FERROR# (повідомляючи про переривання 16). Процедура обробки особливого випадку прочитає sw для визначення конкретної причини особливого випадку. FPU ніколи самостійно не зануляє біти особливого випадку. Їх можна установити в нуль тільки командами ініціалізації finit, установка в 0 особливого випадку fclex, завантаження середовища fldenv і відновлення повного стану frstor. Отже програма може виконувати перевірку особливих випадків після групи команд, а не після кожної команди.

Біт 6 порушення стеку sf (stack fault): фіксує помилки в роботі стека регістрів. FPU установлює sf рівним 1, якщо команда викликає переповнення або антипереповнення стека. Коли sf=1 біт коду умови c1 показує переповнення (с1=1) або антипереповнення (с1=0) стека. Порушення стека фіксується також як особливий випадок недійсної операції.

Біт 7 сумарної помилки es (Error Summary) установлюється в 1 при виникненні будь-якого особливого випадку.

Біти с3с2с1с0 подібні до арифметичних прапорців в регістрі eflags. Вони фіксують особливості результатів команд порівняння, перевірки і аналізу. Використовуються для умовних переходів.

Команда

с0 с3

с2

с1

fcom, fcomp, fcompp,

ftst, fucom, fucomp,

fucopp,, ficom, ficomp

Результат порівняння

Результати не порівнювані

Нуль або O/U#

fxam

Клас операнда

Знак або O/U#

fprem, fprem1

Q2 Q0 0=зведення завершено

1=зведення не завершено

Q1 або O/U#

fist, fbstp, frndint, fst, fstp, fadd, fmul, fdiv, fdivr, fsub, fsubr, fscale, fsqrt, fpatan, f2xm1, fyl2x, fyl2xp1

Не визначені

Заокруглення вгору або O/U#

fptan, fsin,fcos, fsincos

Не визначені 0=зведення завершено

1=зведення не завершено

Заокруглення вгору або O/U#

(не визначено, якщо с2=1)

fchs, fabs, fxch, fincstp, fdecstp, fld, fxtract, fild, fbld, fstp, завантаження сталих

Не визначені

Нуль або O/U#

fldenv, frstor

Кожний біт завантажується з оперативної пам’яті

fldcw, fstenv, fstcw, fstsw, fclex

Не визначені

finit, fsave

нуль нуль

нуль

нуль

Таблиця інтерпретації коду умови

O/U# – коли обидва біти ie і sf слова стану установлені, показуючи особливий випадок стека, цей біт розрізняє переповнення (с1=1) і антипереповнення (с1=0).

В таблиці показано дію команд порівняння, перевірки і аналізу на біти коду умови с3с2с1с0.

Команда fstsw ax – передає слово стану в регістр ax, дозволяючи програмі процесора i486 перевірити їх. Команда sahf копіює біти с3с2с1с0 з регістра ah в біти прапорців процесора i486, спрощуючи умовні переходи. Відображення коду умови на біти прапорців показано в наступній таблиці.

Код умови FPU

Прапорець регістра eflags

с0

с1

с2

с3

cf

немає

pf

zf

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]