evm
ФГБОУ ВПО “Чувашский государственный университет им. И.Н.Ульянова”
Факультет информатики и вычислительной техники
Кафедра вычислительной техники
Лабораторная работа №7
Создание динамических библиотек.
Работу выполнил:
Студент группы ИВТ 41-14
Вишневский В.А.
Работу проверила:
доц. Андреева А.А.
Чебоксары 2016
Цель работы: Научиться создавать программы и под программы на win32.
Тексты Программы и подпрограммы:
Dllrus.asm
;функция удаления сиволов из строки
;function Copy(S:string;Start,Len:byte):string;
;текст подпрограммы
.386
.model flat
public Copy
.code
_start@12:
mov al,1
ret 12
Copy proc
push ebp ;сохранение ebp
mov ebp,esp ;настройка ebp на вершину стека
;адреса параметров в стеке
Len equ byte ptr[ebp+8]
Start equ byte ptr[ebp+12]
S equ dword ptr[ebp+16]
Res equ dword ptr[ebp+20]
push esi
push edi
push ecx
mov esi,S
mov edi,Res
cld ;очистка флага направления
lodsb ;al:=(ds:[si]), si:=si+1 (al - длина S)
stosb ;(es:=[di]):=al, di:=di+1 (запись длины)
mov ecx, 0 ;подготовка сх в качестве счетчика
mov cl, al ;количества символов строки Start
jcxz Exit ;выход если S - пустая строка(cx=0)
cmp al, Start
jb Exit ;выход, если длины строки < Start , копируем пустую строку
mov ah,0
mov al, Start
add si,ax
dec esi
sub cl, Start
inc cl
mov bl, Len
mov bh,0
cmp cx, bx
jbe m2
mov cx,bx
m2: dec edi
mov al, cl ;кол-во копируемых символов
stosb
rep movsb ;копируем в Res Len символов
Exit: pop ecx
pop edi
pop esi
pop ebp
ret 16
Copy endp
end _start@12
Dlldemo1.asm
include dlldemo.inc
includelib dllrus.lib
extrn Copy:near
.386
.model flat
.const
title_string1 db 'String1',0
title_string2 db 'String2',0
.data
S db 12,'abcdeklmnjuy',0
Start db 4
Len db 5
Res db 11 dup(0)
.code
_start:
push MB_OK
push offset title_string1 ; title_string
push offset S+1
push 0
call MessageBox
mov eax,offset Res
push eax
mov eax, offset S
push eax
mov al, Start
push eax
mov al, Len
push eax
call Copy
push MB_OK
push offset title_string2
push (offset Res)+1
push 0
call MessageBox
push 0
call ExitProcess
end _start
Dlldemo2.asm
include dlldemo.inc
.386
.model FLAT,STDCALL
.const
title_string1 db 'String1',0
title_string2 db 'String2',0
libr db 'dllrus.dll',0
nameproc db 'Copy',0
.data
S db 12,'abcdeklmnjuy',0
Start db 4
Len db 7
Res db 11 dup(0)
hlib dd ?
Copy dd ?
.code
_start:
call LoadLibrary,offset libr
mov hlib,eax
call GetProcAddress,hlib,offset nameproc
mov Copy,eax
call MessageBox,0,(offset S)+1,offset title_string1,MB_OK
mov bl,Len
mov dl, Start
call Copy,ebx, edx, offset S, offset Res
call MessageBox,0,(offset Res)+1,offset title_string2,MB_OK
call ExitProcess,0
end _start