Міністерство освіти і науки
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 7
з дисципліни: “Системне програмування”
на тему: Cтворення dll та їх використання
при явному зв’язуванні на мові Assembler
Варіант - 19
Львів – 2016
СТВОРЕННЯ DLL ТА ЇХ ВИКОРИСТАННЯ ПРИ ЯВНОМУ ЗВ’ЯЗУВАННІ НА МОВІ АСЕМБЛЕР
Мета: Ознайомитись з технологією та оволодіти навиками створення та використання бібліотек динамічного компонування з використанням явного зв’язування на мові Асемблера.
ТЕОРИТИЧНІ ВІДОМОСТІ:
Динамічне компонування образу задачі в процесі її виконання надає ряд переваг розробникам програмного забезпечення в порівнянні зі статичним копонуванням. До переваг відносяться:
- зменшується розмір виконуваного файлу;
- у пам’ять завантажують лише одну копію динамічної бібліотеки;
- оновлення бібліотек не веде до перекомпонування застосування;
- реалізовується динамічне завантаження модулів на вимогу;
- можливість спільно використовувати ресурси застосування;
- можна організувати спільну роботу бібліотек, розроблених із використанням різних мов програмування.
Однак воно не позбавлене недоліків:
- сповільнює завантаження застосування;
- не ефективно використовуватися зовнішня пам’ять;
- проблема є зворотної сумісності;
- ускладнюється процес інсталювання програмного застосування.
Однак грамонто володіючи технологією створення та підтримки динамічних бібліотек можне зменшити вплив деяких з цих недоліків на програмний продукт, а деякі подолати.
Можливі 2 способи використання динамічних бібліотек. Вони називаються “явним” та “неявним” зв’язуванням. “Явне” та “неявне” зв’язування бібліотеки з програмою мають суттєві відмінності в процесі написання та компіляції програми.
ЗАВДАННЯ
Створити функцію в бібліотеці DLL на мові Assembler, яка виконуватиме завдання відповідно до варіанту.
ВАРІАНТИ ЗАВДАННЯ:
Підрахувати кількість слів у заданому рядку тексту.
КОД ВИКОНАВЧОЇ ПРОГРАМИ:
Файл(main.asm)
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data
LibName db "dllPart.dll", 0
FunctionName db "WordCounter", 0
DllNotFound db "Cannot load library", 0
AppName db "Load explisit Library", 0
NotFound db "WordCounter function not found", 0
.data?
hLib dd ?
WordCounterAddr dd ?
.code
start :
invoke LoadLibrary, addr LibName ; завантаження бібліотеки
;--------------------------------------------------------------
.if eax == NULL ; якщо завантаження не вдалося
invoke MessageBox, NULL, addr DllNotFound, addr AppName, MB_OK
; вивести повідомлення про відсутність бібліотеки
.else
mov hLib, eax ; збереження заголовку бібліотеки
;--------------------------------------------------------------
invoke GetProcAddress, hLib, addr FunctionName ; визначення адреси функції
.if eax == NULL ; якщо не вдалося взяти адресу
invoke MessageBox, NULL, addr NotFound, addr AppName, MB_OK
; вивести повідомлення про відсутність потрібної функції
.else
mov WordCounterAddr, eax
call[WordCounterAddr] ; виклик функції
.endif
;--------------------------------------------------------------
invoke FreeLibrary, hLib ; вивантаження бібліотеки
.endif
;--------------------------------------------------------------
invoke ExitProcess, NULL
end start
;--------------------------------------------------------------
КОД БІБЛІОТЕКИ DLL:
Заголовочний файл(dllPart.def)
LIBRARY dllPart ; назва бібліотеки
EXPORTS WordCounter ; назва функцій її інтерфейсу
Реалізація бібліотеки(dllPart.asm)
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
.data
dfmt db "%d",0
sfmt db "%s",0
ukr db "Добрий день, Василь Степанович ",13,10,0
vvid db "Enter text: ",0
res db "Number words: ",0
.data?
Buffer db 100 dup (?)
.code
;-------------------- Стартова функція --------------------------
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
ret
DllEntry Endp
;-------------------- Функція підрахунку кількості слів в тексті--------------
WordCounter PROC msg:DWORD
invoke crt_printf, addr sfmt, addr ukr
invoke crt_printf, addr sfmt, addr vvid
mov esi, 0
mov ebx, 0 ; лічильник слів
invoke crt_gets, addr Buffer ; ввід тексту
func:
.if Buffer[esi] == ' '
.if Buffer[esi + 1] != ' '
inc ebx
.endif
.endif
inc esi
.if Buffer[esi] != '0'
jmp func
.endif
invoke crt_printf, addr sfmt, addr res
invoke crt_printf, addr dfmt, ebx ; вивід результату
invoke crt_getchar
ret
WordCounter ENDP
End DllEntry
РЕЗУЛЬТАТ ВИКОНАННЯ:
/
Рис.1 Вміст консолі після виконання програми
ВИСНОВОК:
На даній лабораторній роботі я оволодів навиками створення та використання бібліотек динамічного компонування на мові програмування Assembler з використанням явного зв’язування.