
- •Завдання на лабораторну роботу
- •Теоретичні відомості
- •32-Бітний формат чисел з плаваючою комою
- •64-Бітний формат чисел з плаваючою комою
- •80-Бітний формат чисел з плаваючою комою
- •Система команд математичного співпроцесора
- •Система команд співпроцесора Intel 8087 Команди передачі даних
- •Команди порівняння даних
- •Арифметичні команди
- •Трансцендентні функції
- •Команди управління співпроцесором
- •Реалізація функцій через команди співпроцесора
- •Програми, використані для роботи
- •Стандартні функції
- •Правила звернення до функції виведення printf
- •Функція вводу scanf
- •Приклад лабораторної роботи для функції lg(X)
Трансцендентні функції
FCOS |
Обчислення косинуса. ST (0) = COS (ST (0)). Вміст в ST (0) інтерпретується як кут в радіанах. (Тільки починаючи з 80 486 процесора) |
FPTAN |
Частковий тангенс. Вміст в ST (0) інтерпретується як кут в радіанах. Розміщує в стеку такі два числа x і y, що y / x = tg (ST (0)). Після виконання команди число y розташовується в ST (0), а число x записуєтьсяв стек зверху (тобто записується в ST (1)). |
FPATAN |
Обчислення часткового арктангенса. ST (0) = arctg (ST (0) / ST (1)). |
FSIN |
Обчислення синуса. ST (0) = SIN (ST (0)). Вміст в ST (0) інтерпретується як кут в радіанах. (Тільки починаючи з 80 486 процесора) |
FSINCOS |
бчислення синуса і косинуса. ST (0) = SIN (ST (0)) і ST (1) = COS (ST (0)) (Тільки починаючи з 80 486 процесора) |
F2XM1 |
Обчислення. ST (0) = 2 ^ ST (0) -1. Параметр повинен знаходиться в таких межах: -1 <= x <= 1 |
FYL2X |
Обчислення Y * LOG2 (X). ST (1) = Y, ST (0) = X. Відбувається виштовхування обох операндів з стека, і потім в вершину стека поміщається результат обчислення. |
FYL2XP1 |
Обчислення Y * LOG2 (X +1). ST (1) = Y, ST (0) = X. Відбувається виштовхування обох операндів з стека, і потім в вершину стека поміщається результат обчислення. На операнд x накладається обмеження: 0 <x <1 - 1/sqrt (2) |
Команди управління співпроцесором
FINIT |
Ініціалізація співпроцесора. | |
FSTSW АХ |
Запис слова стану в АХ. Далі вміст регістра AH можна переписати в регістр прапорів центрального процесора за допомогою команди SAHF. Біти кодів умов співпроцесора відображаються (проектуються) на регістр прапорів центрального процесора таким чином, щоб без додаткових дій, використовувати команди умовних переходів. | |
FSTSW dest |
Запис слова стану в dest. | |
FLDCW src |
Завантаження керуючого слова (16 біт) з dest. | |
FSTCW dest |
Збереження керуючого слова в dest. | |
FCLEX |
Скидання винятків. Також скидаються біти ES і B | |
FSTENV dest |
Збереження стану устаткування (SR, CR, TAGW, FIP, FDP) в пам'яті. | |
FLDENV src |
Завантаження стану обладнання з пам'яті. | |
FSAVE dest |
Збереження стану обладнання і файлу регістрів в пам'яті. | |
FRSTOR src |
Завантаження стану обладнання і файлу регістрів з пам'яті. | |
FINCSTP |
Інкремент покажчика стека. | |
FDECSTP |
Декремент покажчика стека. | |
FFREE ST(i) |
Звільнення регістру - позначка ST (i) як вільного. | |
FNOP |
Холоста операція співпроцесора. | |
WAIT (FWAIT) |
Очікування процесором завершення поточної операції співпроцесором. |
Реалізація функцій через команди співпроцесора
2^x
Співпроцесор має команду f2xm1, яка обчислює
для x зпроміжку
[-1; 1]. Такожєкоманда fscale,якаобчислюєдляцілихx.Якщовиділити цілутадробовучастинуx, тозадопомогоюцихкомандможливорозраховувати2^xдля будь якихдіснихx.
e^x
Ми вміємо обчислювати.Звідси
.Тоді:
Таким чином:,тобтомизвелизадачудопопередньої.
ln(x)
lg(x)
arcsin(x)
arccos(x)
sin(x)
cos(x)
sh(x)
ch(x)
Виклик стандартних функцій мови С
Для обміну даними і обчислення стандартних математичних функцій в якості базового мови обраний С. Для використання бібліотечних функцій цієї мови до складу завантажувального модуля повинні бути включені програми що реалізують так зване середовище мови.
Це виконується з використанням стандартної вхідної точки бібліотеки __ astart (увага, два підкреслення - не помилка). Модуль __ astart виконає установку оточення, включаючи завантаження сегментних регістрів, покажчика стека, емулятора співпроцесора з плаваючою точкою, а також звернення до функції з ім'ям _main і повернення в MS-DOS після виходу з функції _main.
Сегменти для моделей пам'яті Small, використовуваної в даній роботі
Ім’я сегменту |
Вирывнювання |
Комбінування |
Клас |
Група |
Вміст сегмента |
_TEXT |
WORD |
PUBLIC |
CODE |
|
виконувані коди |
_DATA |
WORD |
PUBLIC |
DATA |
DGROUP |
Ініціалізовані дані |
CONST |
WORD |
PUBLIC |
CONST |
константи | |
_BSS |
WORD |
PUBLIC |
BSS |
неініціалізовані дані | |
STACK |
PARA |
STACK |
STACK |
область стека |
Модуль мовою Асемблера, що з'єднуються з середовищем і бібліотечними підпрограмами мови C, повинен мати наступну структуру:
EXTRN __astart:near ; В начале программы
DGROUP GROUP _DATA,STACK
ASSUME CS:_TEXT,DS:DGROUP
_DATA SEGMENT PUBLIC 'DATA'
. . .
_DATA ENDS
_TEXT SEGMENT PUBLIC 'CODE'
; ***********************************************************
; Головна програма, що задається в асемблерному модулі, повинна
; Бути визначена в процедурі main
start: jmp __astart ; В кодовомусегменті
_main proc near
. . .
_main endp
; ***********************************************************
; Далі включаються процедури користувача на асемблері
. . .
_TEXT ENDS
STACK SEGMENT STACK 'STACK'
. . .
STACK ENDS
END start ; кінець програми