Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Xme1ez
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 37
1

Передача параметров в функцию (stdcall)

08.12.2014, 20:50. Просмотров 808. Ответов 0
Метки нет (Все метки)

Здравствуйте, есть программа и библиотека. В библиотеке есть функция, которая ищет кол-во вхождений подстроки в строке. Но эти строки объявлены в библиотеке. Помогите доделать программу, чтобы строки, а именно str1 и str2 передавались в функцию из основной согласно конвенции STDCALL.
библиотека:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
str1    db "six little rat cubs, big rat and three old rats",0
str2    db "rat",0
count dd 0
 
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    mov eax,TRUE
    ret
DllEntry endp
strfind proc
    push ebx
    push esi
    push edi
    invoke lstrlen, addr str2
    dec eax
    mov ebx,eax
    invoke lstrlen, addr str1
    mov ecx,eax
    mov edi,offset str1
a2: mov al,str2[0]
    repne scasb
    jecxz exit
    push ecx
    mov esi,offset str2+1
    mov ecx,ebx
    repe cmpsb
    jne a1
    inc count
    sub [esp],ebx
a1: pop ecx
    or ecx,ecx
    jne a2
exit:   mov eax,count
    pop edi
    pop esi
    pop ebx
    ret
strfind endp
end DllEntry
основная прога:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
MsgCaption      db "поиск подстроки в строке",0
buffer      db 100 dup (0)
template db "найдено %d вхождения подстроки str1 в строку str2",0
LibName db "3.dll",0
FunctionName db "strfind",0
DllNotFound db "Cannot load library",0
AppName db "Load Library",0
FunctionNotFound db "strfind function not found",0
str1    db "six little rat cubs, big rat and three old rats",0
str2    db "rat",0
.data?
hLib dd ?
strfind dd ?
.code
start:
    invoke LoadLibrary,addr LibName
   ;-------------------------------------------------------------------------------
   ; Вызываем LoadLibrary и передаем имя желаемой DLL. Если вызов проходит успешно,
   ; будет возвращен хэндл библиотеки (DLL). Если нет, то будет возвращен NULL.
   ;-------------------------------------------------------------------------------
        .if eax==NULL
                invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
        .else
                mov hLib,eax
                invoke GetProcAddress,hLib,addr FunctionName
   ;------------------------------------------------------------------------------
   ; Когда вы получаете хэндл библиотеки, вы передаете его GetрrocAddress вместе
   ; с именем функции в этой dll, которую вы хотите вызвать. Она возвратит адрес
   ; функции, если вызов пройдет успешно. В противном случае, она возвратит NULL.
   ; Адреса функций не изменятся, пока вы не перезагрузите библиотеку. Поэтому
   ; их можно поместить в глобальные переменные для будущего использования.
   ;------------------------------------------------------------------------------
                .if eax==NULL
                        invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
                .else
                        mov strfind,eax
                        call [strfind]
   ;----------------------------------------------------------------------------
   ; Затем мы вызываем функцию с помощью call и переменной, содержащей адрес
   ; функции в качестве операнда.
   ;----------------------------------------------------------------------------
    invoke wsprintf,addr buffer,addr template,eax
    invoke MessageBox, NULL,addr buffer, addr MsgCaption, MB_OK
                .endif
                invoke FreeLibrary,hLib
   ;------------------------------------------------------------------------------
   ; Когда вам больше не требуется библиотека, выгружате ее с помощью FreeLibrary.
   ;------------------------------------------------------------------------------
        .endif
    invoke ExitProcess,NULL
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2014, 20:50
Ответы с готовыми решениями:

Используя соглашение stdcall вызвать функцию на ассемблере
надо используя соглашения stdcall вызвать функцию на ассемблере и используя соглашения cdecl и...

Передача параметров в функцию asm вставкой в C++ Builder 2010
Всем привет! Есть функция static void _stdcall. Вызов её происходит неявно, поскольку указатель...

Передача параметров
Нужно написать COM программу,чтобы при вводе с командной строки,она считывала параметр(имя файла) и...

Передача параметров блоком
Как передать в процедуру блоком 2й массив? (в данном случае массив x1). ведь после передачи блока ...

Передача параметров функциям
Доброго времени суток! Уважаемые форумчане, подскажите, почему вот так можно: .data a dd...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2014, 20:50

Передача параметров в процедуру
Пока не нашел функцию ltoa, пытался добавить подсчет количества записанных байтов. Добавил параметр...

Передача параметров в прерываниях
Какие способы адресации при передаче параметров в прерываниях существуют?

Передача параметров в процедуру
Доброго времени суток. Нужна ваша помощь, знатоки! Возникла нужда в изучении процедур и передачи в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru