Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2014, 02:40   #1
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию Процедура из dll не возвращает результат

Есть dll и программа которая вызывает из библиотеки функцию, но возникла проблема, функция не возвращает результат. Задача самой функции состоит в поиске кол-во вхождений подстроки в строке.
вот dll:
Код:
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
.data

str1     db    "123453653",0
str2     db    "3",0
str3     dd    ?
s		 dd	   ?                                                  
M        dd    0
ds1      dd    0
ds2      dd    0
buf      dd    100 dup (?)

.code
DLL_PROCESS_DETACH    equ 0
DLL_PROCESS_ATTACH    equ 1
DLL_THREAD_ATTACH     equ 2
DLL_THREAD_DETACH     equ 3
DllEntryPoint PROC DllId:DWORD,DllEvent:DWORD,DllReserv:DWORD
	MOV EAX, DllEvent
	CMP EAX, DLL_PROCESS_DETACH 
	JNE D1
	JMP _EXIT
D1:		
	CMP EAX, DLL_PROCESS_ATTACH 
	JNE _EXIT
_EXIT:
	MOV EAX,1
	RET 12
DllEntryPoint endp

strmov proc export soff:dword
	XOR EdX, EdX ; обнуляем eax
      XOR ECX, ECX ; обнуляем ecx
      xor edi, edi  ; обнуляем edi
      xor esi, esi ; обнуляем esi
	;xor ebx, ebx
	mov ebx, soff

      CMP BYTE PTR [str1], 0 ; сверяется длинна строки str1, если длинна строки равна
      JZ ex ;                  то переходим в функцию pr
      CMP BYTE PTR [str2],0 ;  сверяется длинна строки str2, если длинна строки равна 0
      JZ ex                  ;  то переходим в функцию pr
      mov edi, offset str1      ; функция проверки длин строк
      xor edx, edx              ; если во второй строке кол-во строк больше,   
      call DlinS                ; чем в первой, то - сразу выход
      mov ds1, eax
      mov edi, offset str2
      xor edx, edx
      call DlinS 
      mov ds2, eax
      cmp ds1, eax
      xor edx, edx
      xor edi, edi
      jl ex
      jge P1

DlinS:   
      inc edx
      cmp byte ptr[edx+edi],0
      jnz DlinS 
      ret
 
P1:
    CMP BYTE PTR [str1+esi], 0;сверяется длинна строки str1+смещение, если длинна строки равна 0
        JE ex                 ;то переходим в функцию ex
P4:
        mov al, [str2+edi]     
        CMP [str1 + esi], al  
        JE P2           
         inc esi            
     xor edi, edi       
         JMP P1         
P2:
    mov M, esi                ; в переменную М помещаем значение из регистра esi
        inc esi               ; инкрементируем esi  
        inc edi                   ; инкрементируем edi
        cmp BYTE PTR [str1+edi],0   ;сверяется длинна строки str2+смещение, если длинна строки равна 0
        JNE P1                      ;то переходим в функцию p1                      
P3:
        sub M,edi            
        inc M 
    mov [ebx+ecx], offset M                 
    push M           
    pop [ebx+ecx]      
    inc ecx        
        xor edi, edi        
        JMP P1          

ex:
ret 4

strmov endp
END DllEntryPoint
а это прога вызывает:
Код:
.486
.model flat, stdcall
option casemap :none   
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
includelib C:\temp\poltava\dlib.asm.lib

INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDE C:\MASM32\INCLUDE\USER32.INC
.data

rezultat    db    "0",0
.code
start:
extern strmov@4:near

	PUSH OFFSET rezultat

call strmov@4
print offset rezultat
ret
end start
Женька Good вне форума Ответить с цитированием
Старый 05.12.2014, 07:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты проверь чему равен EAX в конце отработки функции ДЛЛ. РЕзультат должен капать в него, если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.12.2014, 11:07   #3
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты проверь чему равен EAX в конце отработки функции ДЛЛ. РЕзультат должен капать в него, если не ошибаюсь.
нет там результата
Женька Good вне форума Ответить с цитированием
Старый 05.12.2014, 11:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну так а что она должна тогда возвращать?
Вообще функция твоя? Ты ее писал? Как она работает знаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.12.2014, 12:22   #5
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну так а что она должна тогда возвращать?
Вообще функция твоя? Ты ее писал? Как она работает знаешь?
знаю как работает, она должна возвращать номера позиций вхождения подстроки, изначально она возвращала в [str3+смещение], когда была асм`овским файлом.
Женька Good вне форума Ответить с цитированием
Старый 05.12.2014, 16:53   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну сколько я не смотрю на strmov, я нигде не вижу загрузки значения в ЕАХ.
Зато есть загадочная строка:
XOR EdX, EdX ; обнуляем eax

Иными словами, у вас в ЕАХ мусор.
waleri вне форума Ответить с цитированием
Старый 06.12.2014, 12:50   #7
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну сколько я не смотрю на strmov, я нигде не вижу загрузки значения в ЕАХ.
Зато есть загадочная строка:
XOR EdX, EdX ; обнуляем eax

Иными словами, у вас в ЕАХ мусор.
подскажите, как это сделать? вот исправил процедуру
Код:
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib

.data
str1     db    "123453653",0
str2     db    "3",0
str3     dd    ?
s		 dd	   ?                                                  
M        dd    0
ds1      dd    0
ds2      dd    0

.code
DLL_PROCESS_DETACH    equ 0
DLL_PROCESS_ATTACH    equ 1
DLL_THREAD_ATTACH     equ 2
DLL_THREAD_DETACH     equ 3
DllEntryPoint PROC DllId:DWORD,DllEvent:DWORD,DllReserv:DWORD
	MOV EAX, DllEvent
	CMP EAX, DLL_PROCESS_DETACH 
	JNE D1
	JMP _EXIT
D1:		
	CMP EAX, DLL_PROCESS_ATTACH 
	JNE _EXIT
_EXIT:
	MOV EAX,1
	RET 12
DllEntryPoint endp

strmov proc export soff:dword
      XOR EAX, EAX ; обнуляем eax
      XOR ECX, ECX ; обнуляем ecx
      xor edi, edi  ; обнуляем edi
      xor esi, esi ; обнуляем esi
 
      CMP BYTE PTR [str1], 0 ; сверяется длинна строки str1, если длинна строки равна
      JZ ex ;                  то переходим в функцию pr
      CMP BYTE PTR [str2],0 ;  сверяется длинна строки str2, если длинна строки равна 0
      JZ ex                  ;  то переходим в функцию pr
      mov edi, offset str1      ; функция проверки длин строк
      xor eax, eax              ; если во второй строке кол-во строк больше,   
      call DlinS                ; чем в первой, то - сразу выход
      mov ds1, eax
      mov edi, offset str2
      xor eax, eax
      call DlinS 
      mov ds2, eax
      cmp ds1, eax
      xor eax, eax
      xor edi, edi
      jl ex
      jge P1

DlinS:   
      inc eax
      cmp byte ptr[eax+edi],0
      jnz DlinS 
      ret
 
P1:
    CMP BYTE PTR [str1+esi], 0;сверяется длинна строки str1+смещение, если длинна строки равна 0
        JE ex                 ;то переходим в функцию ex
P4:
        mov al, [str2+edi]     
        CMP [str1 + esi], al  
        JE P2           
         inc esi            
     xor edi, edi       
         JMP P1         
P2:
    mov M, esi                ; в переменную М помещаем значение из регистра esi
        inc esi               ; инкрементируем esi  
        inc edi                   ; инкрементируем edi
        cmp BYTE PTR [str2+edi],0   ;сверяется длинна строки str2+смещение, если длинна строки равна 0
        JNE P1                      ;то переходим в функцию p1                      
P3:
        sub M,edi            
        inc M 
	mov eax, M
    mov [str3+ecx], eax                 
    push M           
    pop [str3+ecx]      
    inc ecx        
        xor edi, edi        
        JMP P1          
ex:
	ret 4

strmov endp
END DllEntryPoint

Последний раз редактировалось Женька Good; 06.12.2014 в 13:01.
Женька Good вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать функцию вычисления гиперболического косинуса , которая возвращает результат через собственное имя. Макс555 Помощь студентам 4 03.07.2012 19:53
Процедура возвращает нули (готовим бубен) Dexes Паскаль, Turbo Pascal, PascalABC.NET 0 29.02.2012 21:57
.Value возвращает неверный результат Drilla Microsoft Office Excel 2 21.09.2011 08:46
функция не возвращает результат=( Chica Bond Общие вопросы C/C++ 14 03.12.2010 18:47
Как создать функцию, которая возвращает результат - строку типа ansistring. atg C++ Builder 2 28.10.2009 18:20