- •2. Структура регістра eflags
- •3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі
- •4. Формати і типи даних. Формат машинних команд. Система переривань
- •5. Десяткова арифметика. Форми зображення десяткових чисел
- •7. Ділення ascii-чисел.
- •6. Директиви сегментації. Директиви proc і endp
- •7. Опис простих типів мовою асемблера
- •10. Синтаксис команд мовою асемблера
- •11. Команди передач даних
- •Xchg ax, data1; (data2) в data1, (ax) – початковий стан
- •12. Стекові передачі даних
- •13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
- •14. Команди передачі даних movXx. Команда setCc. Команда xlat
- •15. Команди додавання, віднімання і порівняння
- •Inc reg/mem; Розмір 8/16/32.
- •16. Команди множення і ділення
- •20. Команди логічних операцій. Команди зсувів
- •22. Команди операцій з двійковими ланцюжками
- •23. Команди передачі керування (безумовні переходи)
- •24. Команди умовних переходів і команди керування циклами
- •26. Команди переривань і повернення з переривань
- •Загальні поняття.
- •Використання префіксів в ланцюжкових командах.
- •Команда movs.
- •Команда cmps.
- •Команда scas.
- •Команда lods.
- •Команда stos.
- •Команди введення/виведення ланцюжків.
- •29. Команди керування процесором
- •Команди, які впливають на прапорці.
- •Команди синхронізації.
- •Системні команди
- •31. Формати даних, які підтримуються fpu
- •Параметри для трьох форматів в таблиці
- •32. Програмна модель fpu
- •33. Слово стану sw і слово керування cw пристрою fpu.
- •Відповідність між кодом умови і прапорцями
- •34. Команди передач даних fpu: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих.
- •35. Арифметичні команди fpu: додавання, віднімання, множення, ділення.
- •36. Додаткові арифметичні команди fpu.
- •37. Команди порівняння fpu
- •38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
- •39. Команди керування пристроєм fpu
- •40. Спеціальні числові значення та особливі обчислювальні ситуації
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
|
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 |