Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторної роботи № 7
з дисципліни: “Системне програмування”
на тему: “Створення DLL та їх використання
при явному зв’язування на мові Асемблер”
Мета лабораторної роботи
Ознайомитись з технологією та оволодіти навиками створення та використання бібліотек динамічного компонування з використанням явного зв’язування на мові Асемблер.
Теоретичні відомості
“Явне” зв’язування бібліотеки з програмою (Run-time dynamic linking) полягає в тому, що бібліотека (яка міститься у файлі з розширенням .dll) завантажується в пам’ять в момент часу, що визначається розробником, за допомогою виклику АРІ функцій LoadLibrary або LoadLibraryEX. При успішному виконанні функція повертає адресу точки входу. При відсутності бібліотеки, яку необхідно завантажити, або при помилках її завантаження функція поверне NULL, а сама програма, може продовжити виконання. Звичайно, якщо функції, що містяться у відсутній бібліотеці не є критичними для її подальшої роботи.
Індивідуальне завдання
29. Ввести рядок тексту та два окремі символи. Вилучити з вхідного рядка всі другі символи після того як зустрінеться перший символ. Вивести новий рядок на екран.
Код програми
.dll
Labor07.def
LIBRARY Labor07 ; назва бібліотеки
EXPORTS
CharDelete ; назви функцій її інтерфейсу
Labor07.asm
.686
.model flat, stdcall
option casemap : none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
.data?
l dd ?
.code
DllEntry PROC hInstDLL : DWORD, reason : DWORD, reserved : DWORD
mov eax, 1
ret
DllEntry ENDP
CharDelete PROC string : DWORD, char1 : BYTE, char2 : BYTE
fn MessageBox, NULL, string, "Source String", MB_OK
mov esi, string
mov edi, 0
find_char1:
cmp byte ptr [esi + edi], 0
je quit
mov al, char1
cmp byte ptr [esi + edi], al
je delete_char2
inc edi
jmp find_char1
delete_char2:
invoke crt_strlen, string
mov l, eax ; l = length of string
mov ecx, edi
mov edx, edi ; edx = addr of char1 in string
loop1:
inc ecx
cmp ecx, l
jnl quit
mov edi, edx
loop2:
inc edi
cmp byte ptr [esi + edi], 0
je loop1
cmp byte ptr [esi + edi - 1], 0
je loop1
mov al, char2
.if byte ptr [esi + edi] == al
mov al, byte ptr [esi + edi]
mov bl, byte ptr [esi + edi + 1]
mov byte ptr [esi + edi], bl
mov byte ptr [esi + edi + 1], al
.endif
jmp loop2
quit:
fn MessageBox, NULL, string, "Modified String", MB_OK
ret
CharDelete ENDP
End DllEntry
.exe
.686
.model flat, stdcall
option casemap : none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
LibName db "Labor07.dll", 0
FunctionName db "CharDelete", 0
DllNotFound db "Cannot load library", 0
AppName db "Load explicit library", 0
NotFound db "CharDelete function not found", 0
string db "Hello, it is explicit dll function call", 0
char1 db 'o'
char2 db 'l'
.data?
hLib dd ?
.code
start:
invoke LoadLibrary, addr LibName ; завантаження бібліотеки
.if eax == NULL ; якщо завантаження не вдалося
invoke MessageBox, NULL, addr DllNotFound, addr AppName, MB_ICONWARNING
.else
mov hLib, eax ; збереження заголовку бібліотеки
invoke GetProcAddress, hLib, addr FunctionName ; визначення адреси функції
.if eax == NULL ; якщо не вдалося взяти адресу
invoke MessageBox, NULL, addr NotFound, addr AppName, MB_ICONWARNING
.else
movzx ebx, char2
push ebx
movzx ebx, char1
push ebx
push offset string
call eax ; виклик функції
.endif
invoke FreeLibrary, hLib ; вивантаження бібліотеки
.endif
invoke ExitProcess, EXIT_SUCCESS
end start
Результат виконання програми
/ /
Висновок
Я ознайомився з технологією та оволодів навиками створення та використання бібліотек динамічного компонування з використанням явного зв’язування на мові Асемблер.