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

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

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

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

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

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

Здравствуйте, помогите переделать функцию.
Эта функция находится в библиотеке. В таком варианте она возвращает строку содержащую элементы повторяющиеся в первой строке из второй. Например,
1 строка "123456345623"
2 строка "23"
результат "23323"
Код:
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
Женька Good вне форума Ответить с цитированием
Старый 12.12.2014, 18:52   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Женька Good,
функция, которую тебе написали (не плохо еще и автора указывать) возвращает количество вхождений подстроки в строке, а
Цитата:
В таком варианте она возвращает строку содержащую элементы повторяющиеся в первой строке из второй. Например,
1 строка "123456345623"
2 строка "23"
результат "23323"
это уже твои хотелки.
  1. Научись нормально формулировать вопрос
  2. где твои попытки? Показывай, не стесняйся
Mikl___ вне форума Ответить с цитированием
Старый 12.12.2014, 20:32   #3
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию

вот то, что у меня получилось, но в выделенной строке ошибка "invalid instruction operand"

Код:
xor esi,esi
xor ecx,ecx
xor edi,edi
mov ebx,st1
mov edx,st2
c1:
cmp byte ptr[ebx+esi],0
je c4

mov edx,st2
cmp byte ptr[edx+ecx],0
jne c2
inc esi
xor ecx,ecx
jmp c1

c2:
mov edx,st2
mov al,[edx+ecx]
cmp al,[ebx+esi]
je c3
inc ecx
jmp c1

c3:
mov edx,st3
mov [edx+edi], [ebx+esi]

inc esi
inc edi
xor ecx,ecx
jmp c1

c4:
mov edx, st3
mov byte ptr[edx+edi],0
ret
stroka endp
Женька Good вне форума Ответить с цитированием
Старый 12.12.2014, 23:21   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

может поможет
http://programmersforum.ru/showpost....54&postcount=5
f.hump вне форума Ответить с цитированием
Старый 13.12.2014, 00:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну и я свои пять коп: http://www.programmersforum.ru/showp...2&postcount=46
Если что поправьте, писал кустарно, хоть и тестировал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.12.2014, 07:07   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Код:
; masm windows gui #
.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 "вхождения символов из подстроки str2 в строку str1",0
str2     db    "rats",0
str1     db    "six little rats, big fat rat and three old rats",0
num = $ - str1 + 1
str3	db num dup (0)
count dd 0

.code
start:  call strfind2
	invoke MessageBox, NULL,eax, addr MsgCaption, MB_OK
	invoke ExitProcess,NULL
strfind2 proc
	push ebx
	push esi
	push edi
	invoke lstrlen, addr str2
	dec eax
	mov ebx,eax
	invoke lstrlen, addr str1
	mov count,eax
	mov str1[eax],0Dh
	mov edx,offset str3
	sub edx,offset str1
a2:	mov ecx,count
	mov edi,offset str1
	mov al,str2[bx]
a1:	repne scasb
	jecxz exit
	mov [edx+edi-1],al
	jmp a1
exit:	dec bx
	jns a2
	mov ecx,num-1
	mov edi,offset str3
	mov esi,edi
a3:	lodsb
	or al,al
	jz a4
	stosb
a4:	loop a3
	mov byte ptr [edi],0
	mov eax,offset str1
	pop edi
	pop esi
	pop ebx
	ret
strfind2 endp
end start
Mikl___ вне форума Ответить с цитированием
Старый 15.12.2014, 00:19   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

был вдохновлен примером от Stilet
Код:
?SearchAStr@@YAPEADPEBD0@Z	PROC
	MOV rax, rcx
	MOV r8, rcx
	SUB rdx, rcx

	
	XOR rcx, rcx
	
align 16
	sloop:
		MOV cl, [r8]
		MOV r9b, [r8+rdx]

		INC r8
		
		TEST r9b, r9b
		JZ sdone
		JRCXZ end_of_source

		XOR r9b, cl
		JZ sloop
			ADD rdx, rax
			SUB rdx, r8

			MOV rax, r8

	JMP sloop
align 16			
	end_of_source:
		XOR rax, rax

	sdone:

	RET
?SearchAStr@@YAPEADPEBD0@Z	ENDP
f.hump вне форума Ответить с цитированием
Старый 15.12.2014, 00:48   #8
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию

подскажите, как мне переделать функцию от Mikl___, чтобы определяла номера элементов с которых начинается вхождение подстроки в строку
Код:
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
под такую конструкцию, где передаются три параметра в функцию находящуюся в dll-библиотеке, st1- строка, st2-подстрока, st3-возвращаемое значение:
Код:
.386
.model flat, stdcall
option casemap: none

.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

stroka proc st1:DWORD, st2:DWORD, st3:DWORD

;функция

stroka endp

end DllEntryPoint
Буду очень признателен.
Женька Good вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно дописать прогу по поиску подстроки в строке, т.к. возникли небольшие проблемы с типом переменных juicy_2011 Помощь студентам 7 21.07.2011 21:26
Поиск подстроки в строке videolord Общие вопросы по Java, Java SE, Kotlin 2 10.04.2011 09:11
Функция поиска и замены подстроки в строке типа PChar Son Помощь студентам 9 19.04.2010 16:06
поиск подстроки в строке!!! StoneSour Общие вопросы C/C++ 2 15.03.2010 21:31
Не работает функция проверки подстроки в строке Cold_Night Помощь студентам 1 25.03.2009 01:30