- •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. Спеціальні числові значення та особливі обчислювальні ситуації
38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
Команда – обчислення часткового тангенса. Вона сприймає в число з діапазону від до , яке вважається аргументом в радіанах. Повертає результат у двох верхніх регістрах стека: значення тангенса заданого кута заміщує аргумент і в стек записується 1.0. Такі дії пояснюються сумісністю зі співпроцесорами 8087 і 80287, в яких команда дає тангенс, який дорівнює і значення в не дорівнює 1.0. Отже в цих співпроцесорах для одержання тангенса потрібна ще одна дія ділення (це й пояснює появу терміну “частковий тангенс”). Крім того запис у стек 1.0 спрощує обчислення інших тригонометричних функцій. Наприклад, котангенс можна обчислити, виконавши після команду ().
Якщо операнд не припустимий, біт с2 коду умови установлюється в 1 і залишається незмінним. Програмно потрібно операнд звести до значення, яке повинно знаходитися в діапазоні від до , віднімаючи відповідне число, кратне . Щоб не виникло особливого випадку “недійсна операція”, регістр повинен бути порожнім.
Команда – обчислення часткового арктангенса: обчислює . Після цього вилучення зі стека і кут заміщує два операнди у вершині стека. Результат має той же знак, що й операнд в і величину . Термін “частковий арктангенс” успадкований від процесорів 8087 і 80287, в яких були обмеження на значення в і . У 80387 і FPU обмежень на діапазон припустимих аргументів команди немає.
Те, що сприймає два аргументи і обчислює їх відношення, спрощує обчислення інших тригонометричних функцій. Наприклад,
, (38.1)
. (38.2)
Зрозуміло, що в обох цих співвідношеннях .
Покажемо, що формули (38.1) і (38.2) справджуються. Для доведення формули (38.1) застосуємо до обох частин цієї формули функцію
.
Знайдемо . Маємо
.
Оскільки
, то одержуємо
що . Одержана рівність підтверджує правильність співвідношення (38.1).
Для доведення (38.2) застосуємо до обох частин функцію
.
Одержана рівність завершує доведення формули (38.2).
Для обчислення за формулою (38.1) потрібно виконати наступні кроки.
-
Якщо є мірою кута в градусах, то потрібно виконати потрібні перетворення: число градусів помножити на , число мінут – на , число секунд – на і знайдені добутки додати.
-
Записати в стек.
-
Обчислити значення виразу і записати його в стек.
-
Виконати команду (в повинно бути значення виразу , а в – .
Як результат цих дій в регістрі сформується значення виразу . Для виконання обчислень за формулою (38.2) потрібно виконати дії:
-
Якщо є мірою кута в градусах, то потрібно виконати потрібні перетворення: число градусів помножити на , число мінут – на , число секунд – на і знайдені добутки додати.
-
Обчислити значення виразу і записати його в стек.
-
Обчислити значення виразу і записати його в стек.
-
Виконати команду (в повинно бути значення виразу , а в – ).
Як результат цих дій в регістрі сформується значення виразу .
Виконуючи команди і , процесор i486, слідкує за перериваннями. Він може відмінити виконання цих команд для обслуговування переривань. Обидві команди дуже точні і виконуються швидко (біля трьох разів повільніше, ніж команда ділення).
Новими для 80387 і FPU є команди: обчислення синуса , косинуса – , а також синуса косинуса – . Для цих команд - початковий кут в радіанах в діапазоні – від до . Якщо кут за межами діапазону, команди не виконуються, біт с2 установлюється в 1 і не змінюється. Забезпечити допустимий діапазон для початкового кута зобов’язаний програміст, віднімаючи відповідне кратне .
Команди і повертають результат на місці аргументу, а значення синуса на місці аргументу і значення косинуса записується в стек.
Команда використовується для обчислення виразу . Значення береться з і повинно бути з діапазону . Якщо операнд поза припустимим діапазоном, результат невизначений. Віднімання 1 пов’язано з точністю обчислень, коли значення близьке до 0. Результат записується в замість операнда .
Якщо потрібно обчислити значення виразу , то це можна зробити за формулою
. (38.3)
Вираз можна обчислити за допомогою команди , яка обчислює двійковий логарифм числа і множить на . Аргумент повинен бути в регістрі , а – в регістрі , – будь-яке додатне число, а – будь-яке. Команда обчислює логарифм числа з регістра , множить його на і повертає результат в , .
Якщо операнд в від’ємний, виникає особлива ситуація “недійсна операція”.
Отже, у виразі (38.3) легко обчислити показник степеня, тобто . Якщо , то далі легко обчислити , застосувавши команду . Однак, якщо не з даного діапазону, потрібно виконати додаткові обчислення за наступним алгоритмом:
-
спочатку запишемо в ;
-
застосуємо команду і одержимо в мантису числа у форматі числа РТ з характеристикою , а порядок числа в форматі числа РТ в регістрі ;
-
оскільки мантиса подана в нормалізованому вигляді, то вона за модулем більша або рівна 1. Тому для зведення мантиси до потрібного діапазону, якщо вона додатна, то від неї потрібно відняти 1 і до додати 1, а якщо вона від’ємна, то додати 1 і від відняти 1 (тепер , де – вміст регістра , а , де – істинний порядок ;
-
Застосуємо команду . В одержимо ;
-
Виконаємо команду ;
-
Виконаємо команду , в одержимо ;
-
Застосуємо тепер команду , в одержимо .
Для обчислення логарифма за будь-якою основою можна використати формулу
.
Команда – обчислює значення виразу: . Значення вибирається з , причому , значення з регістра і може набувати будь-яких значень . Результат на місці і . Команда забезпечує більшу точність для обчислення логарифмів чисел, близьких до 1. Якщо не з допустимого діапазону, то результат команди невизначений. Команди і можуть бути призупинені і відмінені в зв’язку з обробкою переривання.