- •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. Спеціальні числові значення та особливі обчислювальні ситуації
36. Додаткові арифметичні команди fpu.
Додаткові команди належать до арифметичних, мають безоперандну форму. Всіх команд – 8.
fsqrt – замінює вершину стека коренем квадратним з вмісту вершини стека. , . 1) Виконується порівняно швидко як і команда ділення. 2) Точність команди відповідає точності звичайних арифметичних операцій (похибка результату відповідає половині молодшого біта мантиси). 3) В команді доступні режими заокруглення.
Якщо , то виникає особлива ситуація “не дійсна операція”.
fscale – масштабування інтерпретує як ціле двійкове і додає його
fscale; - це команда швидкого множення ( або ділення вмісту вершини стека на цілий степінь двійки. Обмежень на діапазон немає. Якщо не ціле число, fscale використовує найближче ціле, яке менше за величиною, тобто урізає до нуля. Зручно використовувати для масштабування набору чисел (завантаження, масштабування і збереження). Вміст без зміни.
fprem – обчислює часткову остачу від ділення числа в на і завантажує результат в st(0):
fprem ; st(0)= (st(0)) – q*(st(1)), де q – ціле число. Тут вміст регістра st(1) є модулем в операції обчислення остачі. Знак остачі збігається зі знаком початкового діленого.
Опис команди:
EXPDIF=exponent(st(0)) – exponent(st(1));
if EXPDIF<64 then
q=ціле, яке одержується заокругленням (st(0))(st(1)) до нуля;
st=(st) – (st(1))*q;
c2=0;
c0,c1,c3=три молодших біти q;(q2,q1,q0)
else
c2=1;
n=число між 32 і 63;
qq=ціле, яке одержується заокругленням (st(0))(st(1)) до нуля;
st=(st) – ();
fi;
fprem працює методом ітераційного віднімання і може зменшити показник степеня в st не більше, ніж на 63 за одне своє виконання. Якщо в процесі виконання fprem одержується остача менша за модуль, то функція вважається виконаною і прапорець с2 встановлюється рівним 0. В противному випадку, прапорець с2 стає рівним 1, а результат в st називається неповною остачею. Програма може виконати команду ще раз і одержати повну (або нову неповну) остачу.
Перевірку біта с2 можна за допомогою цілочислового пристрою: передача sw в ax, потім командою sahf переслати вміст регістра ah в регістр eflags і стан прапорця с2 показує прапорець pf. Інший спосіб: порівняння st(0) і st(1). Повна остача отримана, якщо (st(0)) менший (st(1)).
fprem1 – як і команда fprem і обчислює остачу, яка одержується при діленні (st(0)) на (st(1)), причому величина повної остачі менша, ніж половина величини модуля.
Опис команди:
EXPDIF=exponent(st(0)) – exponent(st(1));
if EXPDIF<64 then
q=ціле, яке одержується заокругленням (st(0))(st(1)); (*заокруглення до найближчого цілого або найближчого парного цілого, якщо результат точно посередині між двома числами*)
st=(st) – (st(1))*q;
c2=0;
c0,c1,c3=три молодших біти q;(q2,q1,q0)
else
c2=1;
n=число між 32 і 63;
qq=ціле, яке одержується заокругленням (st(0))(st(1)) до нуля;
st=(st) – ();
fprem1 працює методом ітераційного віднімання і може зменшити показник степеня в st не більше, ніж на 63 за одне своє виконання. Якщо в процесі виконання fprem1 одержується остача менша за модуль, то функція вважається виконаною і прапорець с2 встановлюється рівним 0. В противному випадку, прапорець с2 стає рівним 1, а результат в st називається неповною остачею. Програма може виконати команду ще раз і одержати повну (або нову неповну) остачу.
Перевірку біта с2 можна за допомогою цілочислового пристрою: передача sw в ax, потім командою sahf переслати вміст регістра ah в регістр eflags і стан прапорця с2 показує прапорець pf. Інший спосіб: порівняння st(0) і st(1). Повна остача отримана, якщо (st(0)) менший (st(1)).
Команди fprem і fprem1 мають ще одну особливість, яку можна використати, застосовуючи команди обчислення тригонометричних функцій. Після повного завершення команди fprem і fprem1 (с2=0) біти с0, с3, с1 містять значення трьох молодших бітів частки, які логічно є числовими значеннями номера одного з восьми октантів одиничного круга. Це суттєво можна використати, працюючи з тригонометричними функціями.
frndint – команда заокруглення до цілого. Заокруглює число в st до цілого. Режим заокруглення задається в полі rc регістра cw.
fxtract – команда виділення компонентів числа з плаваючою крапкою. Компонентами такого числа є фактичний порядок і мантиса. Команда розщеплює (st) на порядок і мантису. Порядок перетворює в число з плаваючою крапкою в форматі РТ і записує його замість початкового числа. Мантиса як число в форматі РТ (знак збігається зі знаком початкового операнда, істинний порядок дорівнює 0, тобто зміщений порядок 16383=3fffh, мантиса дорівнює мантисі початкового операнда) записується в нову вершину стека. Якщо початковий операнд дорівнює нулеві, то команда fxtract утворює 0 в st(0), мінус безмежність в st(1) і фіксує особливий випадок “ділення на нуль”.
Команду можна використовувати разом з командою fbstp для перетворення чисел з формату РТ в десятковий формат при виведенні на дисплей або принтер. Відзначимо, що командою fscale розщеплене число можна перетворити в початкове.
Насамкінець ще дві команди:
fabs – st(0)=;
fchs – st(0)= .