- •Затверджую
- •Індивідуальне завдання
- •Анотація
- •Аналіз індивідуального завдання
- •Загальна структура проекту
- •Розробка меню програми
- •Панель інструментів та рядок стану
- •Створення діалогових вікон
- •Створення та підключення бібліотеки dll
- •Реалізація математичної функції мовою assembler
- •Керівництво системного програміста
- •Керівництво оператора
- •Висновки
- •Література
- •Додатки
Реалізація математичної функції мовою assembler
Мова Assembler під Win32
Мова «асемблер» – це низькорівнева мова, тобто мова, що містить методи, які дозволяють безпосередньо звертатись до функцій операційної системи, зокрема виклик переривань та їх функцій, робота з периферійними пристроями через порти введення/виведення, а також звертання до конкретних комірок системної пам’яті та регістрів процесора.
На відміну від програмування під DOS, додатки під Win32 мають значно більше загального. В першу чергу, це пов'язано з тим, що звернення до сервісу операційної системи в Windows здійснюється за допомогою виклику функцій, а не переривань, що було характерне для DOS. Тут немає передачі параметрів в регістрах при зверненні до сервісних функцій і, відповідно, немає безлічі результуючих значень, які повертаються з регістрів загального призначення і регістрів прапорів. Отже, простіше запам'ятати і використати протоколи виклику функцій системного сервісу.
Взагалі написання програм під Win32 стало значно простіше і це обумовлено відсутністю startup коду, характерного для додатків DOS і динамічних бібліотек написаних під Windows 3.X; гнучкою системою адресації до пам'яті: можливістю звертатися до пам'яті через будь-який регістр загального призначення; "відсутністю" сегментних регістрів; доступністю великих об'ємів віртуальної пам'яті; розвиненістю сервісу операційної системи, великою кількістю функцій, що полегшують розробку додатків; різноманіттям і доступністю засобів створення інтерфейсу з користувачем (діалоги, меню і т.п.). Сучасний асемблер розвив засоби виклику процедур, можливість введення шаблонів процедур (опис прототипів), об'єктно-орієнтовані розширення, макроозначення, що вводяться користувачем [8].
Всі ці чинники дозволяють розглядати асемблер, як самостійний інструмент для написання додатків.
Програмування зі змішенням мов – це процес створення програм, що використовують дві або більш початкових мови. Microsoft Visual C++ має вбудований асемблер, який викликається за допомогою функції _asm().
Реалізація функцій мовою Assembler
В даній програмі використовується програмування співпроцесора для роботи з плаваючою комою та фіксованою комою. Співпроцесор для роботи з плаваючою комою має вісім регістрів, які організовані у вигляді стека.
Решта обчислень проводиться аналогічно, повний лістинг asm-коду наведено в Додатку Б.
Створення та підключення бібліотеки dll
Бібліотеки DLL – варіант бібліотек із динамічним зв'язуванням для операційних систем Windows та OS/2.
Динамічне завантаження DLL дозволяє програмі визначити, яка з бібліотек і коли буде завантажуватись, а також задати дію при невдалому завантаженні бібліотеки. Спочатку необхідно помістити модуль бібліотеки в пам’ять процесу. Дана операція виконується за допомогою функції LoadLibrary(), що має один аргумент – ім'я модуля, який необхідно завантажити.
HINSTANCE hDll;
hDll=::LoadLibrary("asmdll");
Стандартним розширення ім’я бібліотеки вважається dll, якщо не вказувати інше. Так як в імені файлу вказано лише його назву, то цей файл повинен знаходитись в одному каталозі з основним файлом типу *.exe. Для визначення адрес окремих функцій всередині бібліотеки використовується функція GetProcAddress():
FUN func;
func=(FUN)::GetProcAddress(hDll, "calc");
Для вивантаження бібліотеки з пам'яті процесу використовується функція FreeLibrary().
Для створення бібліотеки DLL був створений новий проект типу Win32 Dynamic-Link Library та вибраний перемикач Simply DLL.
В результаті було автоматично створено файл, що містить функцію DllMain(), яка є одночасно і функцією входу, і функцією виходу:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
Далі у файлі бібліотеки DLL описана експортована функція. Дана функція має повертати значення змінної res. Тому достатнім є перероблення програми, що була написана в попередньому розділі. Для цього слід функцію main() замінити на функцію, ім'я якої ми використовуємо для визначення адреси:
float calc (float a, int x)
Слід записати, що буде повернуто до основної програми:
return res;
Ім’я експортованої функції потрібно вказати в окремому файлі визначень (файл типу *.def). Цей файл необхідно приєднати до проекту.
В текстовому редакторі в цьому файлі набрати текст файлу визначень:
LIBRARY " asmdll"
EXPORTS
calc @1.
У файлі визначень вказується ім’я експортованої функції та її номер, по якому функцію теж можна викликати [7].
Скомпільований файл необхідно скопіювати до каталогу, в якому знаходиться основна програма.
Лістинг бібліотеки наведено в Додатку Б.
