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

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)= .

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