Обчислення вручну
|
Обчислення в машині
|
|
|
|
|
|
|
|
|
В залежності від способу формування суми
часткових добутків розрізняють чотири основних методи виконання множення та
відповідно чотири структури АЛП для цієї операції.
Метод 1. Множення, починаючи з молодших розрядів
множника, з зсувом часткових добутків вправо при нерухомому множеному.
Послідовність дій в кожному циклі виконання множення визначаються молодшим
розрядом регістра множника, куди послідовно одна за одною надходять цифри множника.
Оскільки по мірі зсуву множника вправо старші розряди регістра множника
звільняються, він може бути використаний для збереження молодших розрядів
добутку, що надходять з молодшого розряду суматора часткових добутків по мірі
виконання множення.
Метод 2. Множення, починаючи з молодших розрядів
множника при зсуві множеного вліво та нерухомій сумі часткових добутків.
Послідовність дій визначається, як і в першому варіанті, молодшим розрядом
регістра множника. При цьому методі регістр множеного та суматор часткових
добутків повинні мати подвійну довжину.
Метод 3. Множення, починаючи зі старших розрядів
множника, при зсуві суми часткових добутків вліво та нерухомому множеному.
Послідовність дій виконання множення визначається старшим розрядом регістра множника.
Даний метод потребує додаткового в порівнянні з першим методом обладнання.
Множення починається з молодших розрядів і множене зсувається вліво на один
розряд в кожному такті.
Метод 4. Множення, починаючи зі старших розрядів
множника, при зсуві вправо множеного та нерухомій сумі часткових добутків.
Послідовність дій на кожному кроці множення визначається старшим розрядом
регістра множника.
Операцію множення найпростіше виконувати в прямих
кодах чисел. Разом з тим, застосування обернених та доповняльних кодів дозволяє
істотно спростити операцію алгебричного додавання. Проте використання такої
форми представлення чисел має певні особливості:
. Дії, що виконуються під час множення обернених
(доповняльних) кодів, залежать від знаку множника.
. Добуток обернених (доповняльних) кодів
співмножників дорівнює оберненому (доповняльному) коду результату тільки у
випадку додатного множника.
. Якщо множник є від'ємним числом, то обернений
(доповняльний) код добутку одержується додаванням поправок і () до добутку обернених
(доповняльних) кодів співмножників. Оскільки поправки мають різну вагу, то
послідовність їх додавання залежить від того, з яких розрядів множника
починається множення.
2. Теоретичні відомості
Для виконання арифметичних операцій над числами з
плаваючою точкою в мікроконтролерах необхідно розробляти досить складні
підпрограми. Вихідні числа в форматі з плаваючою точкою представлені знаком,
мантисою і порядком. Мантиса є правильним дробом, розряди якої представляють
значущі розряди числа, порядок показує фактичний стан точки в запису мантиси.
Для представлення чисел з плаваючою точкою
розроблений і введений стандарт IEEE-754, що включає базовий одинарний, базовий
подвійний, розширений одинарний і розширений подвійний формати, що
відрізняються кількістю розрядів і способами подання мантиси і порядку. На рис.
2.1 приведена структура полів базового 32-розрядного одинарного формату. Формат
містить знаковий розряд S, 8-розрядне поле для зміщеного порядку В і
23-розрядне поле для мантиси F.
Рис. 2.1. Базовий одинарний формат
У цьому форматі при зображенні порядку
використовується зміщення, рівне 127, прихований біт цілої частини мантиси Fq,
що містить 1. Мінімальний (Е = 0) і максимальний (В = 255) порядки
зарезервовані для подання спеціальних чисел. Діапазон ± 38 представлення чисел
в цьому форматі становить ± 10, а точність 6-7 десяткових розрядів. Наведемо
кілька прикладів кодування чисел в цьому форматі:
У розглянутих далі алгоритмах для 8-розрядних
мікроконтролерів приймається уявлення істинного нуля нульовим набором (знак,
порядок, мантиса). Спеціальні числові значення з стандарту (на зображення
нескінченності, невизначеності) враховувати не будемо.
У всіх наведених програмах арифметичних операцій
для мікроконтролерів AVR прийнято розміщення вихідних операндів і результатів у
другій половині регістрів загального призначення (R16… R31). Перший операнд,
символічно позначається А, розміщується в чотирьох регістрах А: РА (порядок),
rtiAL (старший, середній і молодший байти мантиси). Другий операнд, символічно
позначається В, розміщується в регістрах В: РВ (порядок), ТВН, ШВМ, mBL
(мантиса). Результат поміщається перед виходом з процедури в регістри РА, mAL.
Процедура складання чисел з плаваючою точкою
одного знака включає наступні дії:
• визначається різниця порядків доданків Ар = (РА
- РВ). При нерівності порядків, якщо різниця порядків більше О, зсувається
мантиса числа В вправо до тих пір, поки порядок меншого числа В не стане рівним
більшому; якщо різниця порядків менше О, зсувається мантиса числа А вправо;
• після вирівнювання порядків доданків при Ар = О
проводиться складання мантис. Як порядку суми приймається РА або РВ;
• перевіряється мантиса суми на можливість
порушення нормалізації. При додаванні чисел з однаковими знаками можливе
порушення нормалізації тільки вліво на один розряд. Щоб отримати нормалізовану
мантису, необхідно зрушити її вправо. Порядок збільшується на одиницю, що може
привести до переповнення.
На рис. 2.2 приведена схема алгоритму додавання
чисел А і В з плаваючою точкою і однаковими знаками. Кожна складова
представлена однобайтовим порядком і трьохбайтовою мантисою в стандартному
форматі: знак числа, 8-розрядний зміщений порядок, 23-розрядна мантиса з
прихованою одиницею (всього 32 розряду). Число А перед початком операції
розміщено в регістрах РА, mAL, число В-в регістрах РВ, рви, РВМ, pBL. Результат
операції зберігається на місці першого операнда А.
Рис. 2.2. Схема алгоритму складання чисел з
плаваючою точкою
Процедура складання з плаваючою точкою AddF
починається з перевірки знаків доданків. Якщо знаки операндів не збігаються,
знак другого операнда змінюється на протилежний і виконується перехід до
процедури вирахування чисел SubF. Якщо вихідні операнди мають один знак, кожен
з них проходить перевірку на рівність 0. Якщо один з операндів дорівнює О,
складання не проводиться, а результат приймається рівним іншому операнду. При
цьому в разі рівності Про першого операнда регістри А і В обмінюються
операндами. На цьому операція закінчується. Перетворення результату в
стандартний формат не проводиться.
Якщо обидва операнда ненульові, в однобітовому
прапорі Т регістру стану мікроконтролера SREG зберігається загальний знак
операндів і виконується їх відновлення з базового формату. Оскільки для цього
використовується одна і та ж процедура гес з бібліотеки допоміжних процедур,
налаштована на роботу з регістрами А, перед другим відновленням проводиться
обмін операндами.
Далі віднімають порядки. При отриманні негативної
різниці виконується обмін операндами і віднімання повторюється. У разі рівного
розподілу порядків, коли їх різниця Ар = О, у разі переходу до складання
мантисс. В іншому випадку попередньо різниця Ар порівнюється з довжиною
мантиси. Якщо різниця перевищить 24, то при вирівнюванні порядків зі зрушенням
вправо мантиси меншого числа вона покине розрядну сітку, відбувається втрата
значущості. Як результат приймається операнд, який в цей момент знаходиться в
регістрах першого операнда (РА, ша). Якщо різниця менше 24, переходимо до
зрушення мантиси меншого числа, помістивши її в регістри (mAL), різниця
порядків - в регістрі РВ, менший порядок - в регістрі РА. Зрушення мантиси
вправо супроводжується збільшенням порядку в регістрі РА, зменшенням в регістрі
РВ і триває до тих пір, поки в регістрі РВ не отримаємо 0.
Склавши побайтно мантиси, перевіряємо ознака
перенесення, який свідчить про порушення нормалізації. При відсутності його (С
= 0) виконується перехід до перетворення числа в базовий формат. При С = 1
мантиссу суми зрушуємо вправо і порядок збільшуємо на 1. Виконуємо перевірку
переповнення. Якщо утворився порядок, рівний О, це означає перевищення максимального
порядку 255. Програма завершується з встановленим прапором переповнення С.
Отриманий в регістрах РА, результат вважається невизначеним і не форматується.
При відсутності переповнення прапор З скидається і виконується перетворення в
базовий формат.
Програма дозволяє виконати алгебраїчне додавання
чисел з урахуванням знаків доданків. У тому випадку, коли складові мають різні
знаки, відбувається звернення до модуля віднімання. За допомогою
директиви.include «flsub.asm» підключають програмний модуль віднімання чисел з
плаваючою точкою однакових знаків. Це дозволяє в подальшому виконати за
допомогою однієї і тієї ж програми не тільки складання, а й віднімання чисел.
На початку загальної програми складання;
вирахування виконують перевірку коду виконуваної операції: 1 - для складання
(+), 2 - для вирахування (-). Залежно від заданої операції і знаків операндів
запускають процедуру складання або віднімання беззнакових чисел (табл. 2.1).
При необхідності проводиться зміна місць операндів. У підсумку можна застосувати
одну з двох процедур: додавання чи віднімання модулів чисел.
Таблиця 2.1. Виконувані операції
Типові процедури, які використовуються
алгоритмами складання; вирахування, поміщені в бібліотеку, що підключається директивою.include
«fllib.asm». Бібліотека fllib містить процедури відновлення операнда з базового
формату гес, упаковки в базовий формат раек, обмін операндів swapAB, зсуву
мантиси вправо на один розряд shift, логічного додавання 24-розрядної мантиси
для порівняння з нулем.
Відновлення числа з базового формату проводиться
за допомогою чотирьох операцій, як показано на рис. 3.10, а. Спочатку за
допомогою логічного зсуву вліво ф молодший біт порядку з регістра старшого
байта мантиси виштовхується на прапор переносу С. Потім виконується циклічний
зсув вліво вмісту регістра порядку РА Завдяки цьому 8-розрядний порядок
повністю виявляється в регістрі РА. Далі мантиса зсувається вправо @ і в розряд
7 регістра
Перетворення результату операції, що розміщується
після обробки в регістри А, в базовий формат виконується за схемою на рис.
3.10, б. Спочатку зберігаємо порядок РА в одному з регістрів, наприклад РВ ф.
Потім знак результату, який зберігається на прапорі Т, переносимо на прапор З
Виконуючи зрушення вправо регістра порядку РА, вводимо знак числа в розряд 7
регістра РА Передачу молодшого біта порядку в старший розряд мантиси виконуємо
за два кроки: спочатку з розряду Про регістра РВ в Т потім з Т в розряд 7
регістра місце старшого розряду мантиси.
Обмін 32-розрядних операндів в регістрах А і В
здійснюється з використанням логічної функції виключає Або. Дійсно, отримавши
спочатку А <- А Ф В, виконуємо далі В <-ВФАіА <-АФВ. Ці операції
повторюють окремо для кожного байта порядку і мантиси (всього 12 операцій).
Використовувані бібліотечні процедури з коментарями представлені в лістингу
програми 3.4.
Операція починається з провірки знаків доданків
(рис. 3.11). Якщо знаки операндів не збігаються, знак від'ємника змінюється на
протилежний і виконується перехід до процедури складання чисел AddF. Якщо
вихідні операнди з одним знаком, кожен проходить перевірку на рівність 0. Якщо
один з операндів дорівнює О, віднімання не проводиться, а результат приймається
рівним іншому операнду, при необхідності коригується знак результату.
Якщо обидва операнда не рівні О, в Т зберігається
знак зменшуваного і відновлюють обидва числа. При цьому відновлення числа В
передує реєстровий обмін А <-> В. Потім виконують порівняння порядків.
Якщо порядки рівні, порівнюють мантиси, при їх рівності результат операції
вважається рівним 0. Виявляється більше число без урахування знака, яке
поміщається в регістри В. Якщо при цьому виконується обмін регістрів, то
зберігається в Т знак змінюється на протилежний.
Подальші дії пов'язані з вирівнюванням порядків і
зрушенням вправо мантиси меншого числа, яке знаходиться в регістрах А. Після
вирівнювання порядків виконується віднімання мантис і формування результату в
регістрах А. При відніманні мантис з однаковим знаком може виникнути порушення
нормалізації вправо, т. Е. Поява одного або декількох нулів в старших розрядах
мантиси різниці. Усунення порушення нормалізації виконується шляхом зсуву
мантиси різниці вліво і зменшення порядку результату РА на одиницю при кожному
зсуві. Якщо при зменшенні порядку виникне антипереповнення (при зміні порядку
від мінімально допустимого значення 0x00 до максимального значення OxFF),
виконується вихід з процедури з встановленим прапором С = 1 і повернення в
головний модуль програми з невизначеним результатом. Після усунення порушення
нормалізації виконується форматування результату в регістрах А і вихід з
процедури вирахування в основну програму.
Додавання і віднімання чисел А і В з плаваючою
комою може здійснюватися тільки за умови рівності їх порядків. Для цього вони
заздалегідь вирівнюються зсувом одного з них.
3. Розробка алгоритму роботи програми
Для комп'ютерних програм
алгоритм є списком деталізованих інструкцій, що реалізують процес обчислення,
який, починаючи з початкового стану, відбувається через послідовність логічних
станів, яка завершується кінцевим станом. Перехід з попереднього до наступного
стану не обов'язково детермінований - деякі алгоритми можуть містити елементи
випадковості.
Поняття алгоритму
належить до підвалин математики. Обчислювальні процеси алгоритмічного характеру
(як-то арифметичні дії над цілими числами, знаходження НСД двох чисел тощо)
відомі людству з глибокої давнини. Проте, чітке поняття алгоритму сформувалося
лише на початку XX ст
Наша програма повинна мати чіткий, сформований
алгоритм, який дозволить швидко працювати програмі і безперебійно оброблювати
вхідні і вихідні дані.
Алгоритм програми представимо у вигляді
блок-схеми.
Рис. 3.1. Блок-схема алгоритму програми
4.
4. Опис програми
Виклик і завантаження
Способи виклику програми
Виклик програми виконується завантаженням на
виконання файлу ADDMUL.exe
Адреса завантаження програми
Адреса завантаження визначається операційною
системою автоматично.
Відомості про використання оперативної пам'яті
Програма при роботі не ініціює запити на
виділення оперативної пам’яті, крім тої, що виділена їй для роботи операційною
системою.
Обсяг програми
Файл ADDMUL.asm має обсяг 2 Кб, файл ADDMUL.exe - 27 Кб
Вхідні дані
Характер вхідних даних
Вхідні дані для роботи програми являють введені з
клавіатури числа з плаваючою крапкою
Організація вхідних даних
Вхідні дані організовуються у чисел з плаваючою
крапкою.
Попередня підготовка вхідних даних
Попередня підготовка вхідних даних не
обов’язкова.
Вихідні дані
Характер вихідних даних
Вихідними даними є число - результат множення або
дадавання двох чисел з плаваючою крапкою.
Організація вихідних даних
Вихідні дані організовані у вигляді числа з
плаваючою крапкою, що видає програма на екран.
Формат, описання та спосіб кодування даних
Текстові повідомлення, що виводяться на екран.
5. Посібник системного програміста
Призначення програми
Програма призначена для множення або додавання
(відповідно до вибору користувача) двох чисел з плаваючою крапкою
Структура програми
Програма складається з основного програмного
модуля і двох функцій: множення та додавання чисел з плаваючою крапкою.
Програма не містить власних, самостійно створених класів і не використовує
динамічно підключаємі бібліотеки dll.
Налаштування програми
Програма має простий, консольний інтерфейс і не
потребує жодних налаштувань з боку користувача.
Перевірка програми
Перевірку програми на працездатність
забезпечується її тестуванням.
Тестування програмного
забезпечення (англ. Software Testing) - це процес технічного дослідження,
призначений для виявлення інформації про якість продукту відносно контексту, в
якому він має використовуватись. Техніка тестування також включає як процес
пошуку помилок або інших дефектів, так і випробування програмних складових з
метою оцінки. Може оцінюватись:
· відповідність
вимогам, якими керувалися проектувальники та розробники
· правильна
відповідь для усіх можливих вхідних даних
· виконання функцій
за прийнятний час
· практичність
· сумісність з
програмним забезпеченням та операційними системами
· відповідність
задачам замовника.
Оскільки число можливих
тестів навіть для нескладних програмних компонент практично нескінченне, тому
стратегія тестування полягає в тому, щоб провести всі можливі тести з
урахуванням наявного часу та ресурсів. Як результат програмне забезпечення (ПЗ)
тестується стандартним виконанням програми з метою виявлення баґів (помилок або
інших дефектів).
Тестування ПЗ може
надавати об'єктивну, незалежну інформацію про якість ПЗ, ризики відмови, як для
користувачів так і для замовників.
Тестування може
проводитись, як тільки створено виконуваний код (навіть частково завершено).
Процес розробки зазвичай передбачає коли та як буде відбуватися тестування.
Наприклад, при поетапному процесі, більшість тестів відбувається після
визначення системних вимог і тоді вони реалізуються в тестових програмах. На
противагу цьому, відповідно до вимог гнучкої розробки ПЗ, програмування і
тестування часто відбувається одночасно.
Тестування - це одна з
технік контролю якості, що включає в себе
· Планування робіт
(Test Management)
· Проектування
тестів (Test Design)
· Виконання
тестування (Test Execution)
· Аналіз отриманих
результатів (Test Analysis).
Верифікація
(Verification) - це процес оцінки системи або її компонентів з метою визначити
чи задовольняють результати поточного етапу розробки умовам, сформованим на
початку цього етапу. Тобто чи виконуються цілі, терміни, завдання з розробки
проекту, визначені на початку поточної фази. Валідація (Validation) - це
визначення відповідності розроблюваного програмного забезпечення між
очікуваннями і потребами користувача, вимогам до системи.
План Тестування (Test
Plan) - це документ, що описує весь обсяг робіт з тестування, починаючи з опису
об'єкта, стратегії, розкладу, критеріїв початку і закінчення тестування, до
необхідного в процесі роботи обладнання, спеціальних знань, а також оцінки
ризиків з варіантами їх вирішення.
Тест дизайн (Test Design)
- це етап процесу тестування програмного забезпечення, на якому проектуються і
створюються тестові випадки (тест кейси), відповідно до визначених раніше
критеріями якості та цілями тестування.
Тестовий випадок (Test
Case) - це документ, що описує сукупність кроків, конкретних умов і параметрів,
необхідних для перевірки реалізації тестованої функції або її частини.
Баг / Дефект Репорт (Bug
Report) - це документ, що описує ситуацію або послідовність дій (Steps), що
призвела до некоректної роботи об'єкта тестування (Misbehavior), із зазначенням
причин та очікуваного результату (Expected Result).
Тестове Покриття (Test Coverage)
- це одна з метрик оцінки якості тестування, що представляє із себе щільність
покриття тестами вимог або коду, що виконується.
Деталізація Тест Кейсів
(Test Case Specification) - це рівень деталізації опису тестових кроків і
необхідного результату, при якому забезпечується розумне співвідношення часу
проходження до тестового покриття.
Час Проходження Тест
Кейса (Test Case Pass Time) - це час від початку проходження кроків тест кейса
до отримання результату тесту.
Проведемо тестування нашої програми методом
чорного ящика, перевіривши тим самим функціональну придатність програмного
продукту. Тестові випадки наведені в таблиці 7.4.1
Таблиця 5.4.1. Тестові випадки
Номер теста
|
Назва теста
|
Значения вихідних даних
|
Очікуваний результат
|
Реакція програми
|
Висновок
|
1
|
Чорний ящик
|
Додавання A=3.4 B=2.1
|
C=5.5
|
Rezult:5.5
|
Програма працює вірно
|
2
|
Чорний ящик
|
Множення A=3.4 B=2.1
|
С=7,14
|
Програма працює вірно
|
6. Посібник оператора
Дана програма реалізує модель
арифметико-логічного пристрою. Вона виконує арифметичні операції додавання та
множення над числами з плаваючою крапкою.
Після запуску програми відкривається головне
вікно, яке має дружній інтерфейс (меню). Меню складається з 2-х пунктів (див
рис. 6.1):
. Додавання чисел чисел
. Множення чисел
Рис. 6.1. Головне вікно
Якщо натиснути клавішу «1» відбудеться перехід до
мітки, де виконуються операція додавання (див. рис. 6.2).
Рис. 6.2. Вікно додавання
Якщо натиснути клавішу «2» відбудеться перехід до
мітки, де виконуються операція множення (див. рис. 6.3).
Рис. 6.3. Вікно множення
Також реалізована можливість повернення із
кожного підпункту до головного меню програми. Для цього треба натиснути
будь-яку клавішу.
Для введення чисел створенні спеціальні
процедури:
· input_integral_part - для введення
цілої частини числа.
· input_fractional_part - для введення дробової
частини числа
Для введення символів з клавіатури
використовується функція 0Ah переривання 21h. За допомогою цієї функцій, якщо
після введення числа ще не натиснута клавіша «Enter», його можна
редагувати, використовуючи на клавіатурі стрілки вправо/вліво та клавішу «Backspace».
При введенні числа відбувається перевірка на
введений символ. Якщо введено щось інше окрім цифрових значень, то на екрані
з’являється повідомлення про помилку.
Під цілу частину числа виділяється 6 байт, під
дробову також 6 байт. З урахуванням крапки та знака загальна кількість
символів, яка відводиться під число дорівнює 14 байт.
При виборі одного з пунктів меню, додавання або
множення, програма спочатку пропонує ввести цілу частину числа А, потім дробову
частину числа А, потім цілу частину числа B і в кінці дробову
частину числа B. Після цього виконуються відповідні арифметичні операції і
результат виводиться на екран.
Пісня виконання арифметичних дій, програма очікує
на натиснення будь-якої клавіші для повернення до головного меню.
Висновки
В ході виконання завдання курсової роботи мною
було розроблено проект програми на NASM асемблер для множення /
додавання чисел з плаваючою крапкою.
Під час розробки і реалізації алгоритму задачі,
мною було вивчено особливості роботи з мовою низького програмування асемблер,
застосовано на практиці, отримані знання з лекційного курсу.
Програма повноцінно працює при будь-яких вхідних
даних і може бути впроваджена у виробництво і застосовуватись кінцевими
користувачами для заощадження сил і часу па проведення вище вказаних операцій
над числами з плаваючою крапкою.
Список використаних джерел
1. Аблязов Р.З. Программирование на ассемблера на платформе
x86-64. - М.: ДМК Пресс, 2011. - 304 с.
. Голубь Н.Г. Исскуство программирования на ассемблере. Лекции и
упражнения. - 2-е изд., испр. и доп., - СПб.: ДиаСофт, 2002. - 656 с.: ил.
. Зубков С.В. Assembler для DOS, Windows и Unix. - 2 изд., испр. и
доп., - М: ДМК, 2000. - 608 с.: ил.
. Кип Р. Ирвин. Язык ассемблера для процесоров Intel. - 4-е изд.,
Пер. с англ. - М.: Издательский дом «Вильямс», 2005. - 912 с.: ил.
. Крупник А.Б. Изучаем ассемблер. - СПб.: Питер, 2005. - 249 с.
. Магда Ю.С. Ассемблер для процессоров Intel Pentium. - СПб.:
Питер, 2006. - 410 с.: ил.
. Марек Р. Ассемблер на примерах. Базовий курс. - СПб.: Наука и
техника, 2005. - 240 с.: ил.
. Столяров А.В. Программирование на языке ассемблера NASM для OC
UNIX. Уч. пособие. - 2-е изд. - М.: Макс-пресс, 2011. - 188 с.
. Харт Джонсон М. Системное программирование в среде Windows /
Джонсон М. Харт; пер. с англ. - М.: Издательский дом «Вильямс», 2005.
. Юров В.И. Assembler. Учебник для вузов. 2-е изд. - СПб.: Питер,
2003. - 637 с.
. Юров В.И. Assembler. Практикум. 2-е изд. - СПб.: Питер, 2006. -
399 с
Додаток
Лістинг програми NASM асемблер
model small code 386
start: mov ax,@data
mov ds, ax
mov es, ax
main_loop: mov ax, 3; Очищаємо екран
int 10h
mov ah, 9
mov dx, offset string0
int 21h mov ah, 0
int 16h cmp al, '1' je a2
cmp al, '2' je a1
cmp ah, 1 jne main_loop
exit: mov ah, 4Ch
int 21h
a0: mov ax, 3;
int 10h
mov ah, 9
mov dx, offset string8
int 21h
mov ah, 0
int 16h
jmp main_loop
; додавання
a1: mov ax, 3;
int 10h
mov ah, 9
mov dx, offset string1
int 21h
mov string2+30,'A'
mov di, offset A
call input
inc string2+30; міняю A на B в повідомленні 'Vvedit chyslaoA'
mov di, offset B
call input_fractional_part
xor bx, bx
finit; ініціалізація FPU
fild A; завантажили
число А
fild B; завантажили число В
fadd st(1), st; додамо А і В
fst С; результат додавання в змінну С
mov di, offset string5
fldz; загрузили в FPU ноль
db 0DFh, 0F1h; fcomip st, st(1); порівняння числа з
нулем
jnz a3 mov byte ptr [di], '0'; Якщо ціла частина
рівна 0
inc edi jmp b01
a3: fstcw control; Заокруглюємо до
нуля
or control, 0C00h
fldcw control
fld st; дублюємо вміст st(0) в st(1)
frndint;
fsub st(1),
fldz db 0DFh, 0F1h; fcomip st, st(1); прирівнюємо дробову
частину до нуля
jnz a4 mov al, '0'; якщо рівна нулю
stos b
; множення
A2: mov ax, 3;
int 10h
mov ah, 9
mov dx, offset string1
int 21h
mov string2+30,'A'
mov string3+33,'A'
mov di, offset A
call input
inc string2+30; міняю A на B в повідомленні 'Vvedit chyslo A»
mov di, offset B
call input_integral_part
call input_fractional_part
xor bx, bx
finit; ініціалізація FPU
fild A; завантажили
число А
fild B; завантажили число В
fmul st(1), st; множимо А і В
fst С; результат додавання в змінну С
mov di, offset string5
fldz; загрузили в FPU ноль
db 0DFh, 0F1h; fcomip st, st(1); порівняння числа з
нулем
jnz a3 mov byte ptr [di], '0'; Якщо ціла частина
рівна 0
inc edi jmp b01
a3: fstcw control; Заокруглюємо до
нуля
or control, 0C00h
fldcw control
fld st; дублюємо вміст st(0) в st(1)
frndint;
fsub st(1),
fldz db 0DFh, 0F1h; fcomip st, st(1); прирівнюємо дробову
частину до нуля
jnz a4 mov al, '0'; якщо рівна нулю
stos b
@0: mov ah, 9;
mov dx, offset string2; «ввести числа A»
int 21h
i1: mov ah, 0Ah; функция 0Ah прерывания 21h для ввода
строки с клавиатуры
mov dx, offset buffer; сюда пойдет
ввод - > buffer db 7,?, 7 dup(?)
int 21h mov ch, 0
mov cl, buffer+1;
mov si, offset buffer+2;
cmp cl, 6 ja @3er
loop @1 retn;
@4: mov ah, 921h mov ah, 0Ah
mov dx, offset buffer
int 21h mov ch, 0
mov cl, buffer+1
mov si, offset buffer+2
test cx, 1 jz @5
mov bx, offset buffer+2 add bx, cx
mov byte ptr [bx], '0'
inc cx @5: lodsb
sub al, '0' cmp al, 9
ja @6; Якщо не цифра то помилка
mov ah, al lodsb
sub al, '0' cmp al, 9
ja @6; Якщо не цифра то помилка
shl al, 4;
db 0Dh, 0Ah, 'Natysnit 1, shob dodatu
db 0Dh, 0Ah, 'Natysnit 2, shob pomnozhutu
string2 db 0Dh, 0Ah, 'Vvedit chyslo A', 0Dh, 0Ah,
'$'
string6 db 0Dh, 0Ah, 'Rezultat '
string5 db 50 dup ('$')