Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Assembler Ввести массив (символьный) с клавиатуры и вывсти по символьно //www.cyberforum.ru/asm-beginners/thread1323547.html
Приветсвую вас братцы программисты! Задача следующая нужно мне вывести строку заданную с клавиатуры в заданной позиции экрана наискосок. Ну с этим мне все понятно. Собственно трудности с...
Assembler Программа "Редактор" Собственно имеется готовая программа редактора, но мне нужно внести некоторые изменения в .аsm файл. В папке имеется asm файл и батник, при попытке запустить батник выбивает ошибку, что не может... //www.cyberforum.ru/asm-beginners/thread1323518.html
Фигура и макрос Assembler
1. Нарисовать эту фигуру в Assembler 2.Вывести на позиции 12.1 свою ФИО через макросы. Прошу помочь с этими двумя задачками.
Assembler Рисуем фигуру в Assembler
Здравствуйте, помогите, пожалуйста, нарисовать вот такую фигуру заранее спасибо. Я новичок в Assembler'e.
Assembler Цикл в opcode //www.cyberforum.ru/asm-beginners/thread1323289.html
Добрый день! Есть файл message.com и необходимо сделать следующее: Составить программу, которая выдаёт на дисплей строку текста с предложением ввести несколько (по своему усмотрению) символов,...
Assembler Имена и адреса Добрый вечер. Компилятор обрабатывает переменные как адреса памяти. Возник вопрос, как именам переменных сопоставляются адреса? Например, вместо "a" в инструкции "inc a" по идее должен быть... подробнее
Xme1ez
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 37
0

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

08.12.2014, 20:50. Просмотров 812. Ответов 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


Вернуться к обсуждению:
Передача параметров в функцию (stdcall)
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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru