Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KP_SPZ_v11-2015.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
732 Кб
Скачать
☆
  1. Реалізація математичної функції мовою assembler

    1. Мова Assembler під Win32

Мова «асемблер» – це низькорівнева мова, тобто мова, що містить методи, які дозволяють безпосередньо звертатись до функцій операційної системи, зокрема виклик переривань та їх функцій, робота з периферійними пристроями через порти введення/виведення, а також звертання до конкретних комірок системної пам’яті та регістрів процесора.

На відміну від програмування під DOS, додатки під Win32 мають значно більше загального. В першу чергу, це пов'язано з тим, що звернення до сервісу операційної системи в Windows здійснюється за допомогою виклику функцій, а не переривань, що було характерне для DOS. Тут немає передачі параметрів в регістрах при зверненні до сервісних функцій і, відповідно, немає безлічі результуючих значень, які повертаються з регістрів загального призначення і регістрів прапорів. Отже, простіше запам'ятати і використати протоколи виклику функцій системного сервісу.

Взагалі написання програм під Win32 стало значно простіше і це обумовлено відсутністю startup коду, характерного для додатків DOS і динамічних бібліотек написаних під Windows 3.X; гнучкою системою адресації до пам'яті: можливістю звертатися до пам'яті через будь-який регістр загального призначення; "відсутністю" сегментних регістрів; доступністю великих об'ємів віртуальної пам'яті; розвиненістю сервісу операційної системи, великою кількістю функцій, що полегшують розробку додатків; різноманіттям і доступністю засобів створення інтерфейсу з користувачем (діалоги, меню і т.п.). Сучасний асемблер розвив засоби виклику процедур, можливість введення шаблонів процедур (опис прототипів), об'єктно-орієнтовані розширення, макроозначення, що вводяться користувачем [8].

Всі ці чинники дозволяють розглядати асемблер, як самостійний інструмент для написання додатків.

Програмування зі змішенням мов – це процес створення програм, що використовують дві або більш початкових мови. Microsoft Visual C++ має вбудований асемблер, який викликається за допомогою функції _asm().

    1. Реалізація функцій мовою Assembler

В даній програмі використовується програмування співпроцесора для роботи з плаваючою комою та фіксованою комою. Співпроцесор для роботи з плаваючою комою має вісім регістрів, які організовані у вигляді стека.

Решта обчислень проводиться аналогічно, повний лістинг asm-коду наведено в Додатку Б.

  1. Створення та підключення бібліотеки 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].

Скомпільований файл необхідно скопіювати до каталогу, в якому знаходиться основна програма.

Лістинг бібліотеки наведено в Додатку Б.

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