· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› поиск в тексте

Посл.отвђт Сообщенiе


Дата: Дек 4, 2002 20:01:29

Народ, подскажите. Есть кусок текста, например: "Assembler is the best language" как найти слово "best" а затем вывести его в MessageBox'e?


Дата: Дек 5, 2002 02:20:01 · Поправил: Безпощадный даос

msg(strstr("Assembler is the best language", "best", 1))
strstr proc pszHaystack:PTR BYTE, pszNeedle:PTR BYTE, dwCaseSensitive:DWORD
	push	esi
	push	edi
	xor	eax, eax
	xor	ecx, ecx
	xor	edx, edx
	mov	esi, [pszHaystack]
	mov	edi, [pszNeedle]
@@char:	mov	al, byte ptr [esi]
	mov	ah, byte ptr [edi]
	cmp	byte ptr [dwCaseSensitive], 0
	jne	@@cmp1
	cmp	al, "Z"
	ja	@@cmp0
	cmp	al, "A"
	jb	@@cmp0
	add	al, 32
@@cmp0:	cmp	byte ptr [dwCaseSensitive], 0
	jne	@@cmp1
	cmp	ah, "Z"
	ja	@@cmp1
	cmp	ah, "A"
	jb	@@cmp1
	add	ah, 32
@@cmp1:	cmp	al, ah
	jne	@@next
	inc	ecx
	mov	eax, esi
	inc	edi
	inc	esi
	cmp	byte ptr [esi], 0
	je	@@quit
	inc	eax
	cmp	byte ptr [edi], 0
	je	@@quit
	jmp	@@char
@@next:	mov	edi, [pszNeedle]
	test	ecx, ecx
	setz	dl
	add	esi, edx
	xor	ecx, ecx
	xor	eax, eax
	cmp	byte ptr [esi], 0
	jne	@@char
@@quit:	sub	eax, ecx
	pop	edi
	pop	esi
	ret
strstr endp


Дата: Дек 5, 2002 02:22:42


Дата: Июл 25, 2003 02:02:45 · Поправил: Безпощадный даос

Извини ,что на С++
//mona #include<stdio.h>toda budet C
 //no ya nachinal na C 
 /*если не поленишься  организуй   рекурсию ,будет any word naxodit.......*/                
#include<iostream.h>
#include<conio.h>
int main()
{
 char* answer=new(char);
 char* message="Assembler is the best language";
 int i=0;
 while(message[i])
 {
  if (message[i]==' ')
  {
   if(message[i+1]=='b')
   {
    if(message[i+2]=='e')
    {
     if(message[i+3]=='s')
     {
      if(message[i+4]=='t')
      {
       if(message[i+5]==' ')
       {
        answer="best";
       }
      }
     }
    }
   }
  }
  i++;
 }
 cout<<answer<<"\n";//a tut printf("%s",answer);
 getch();
}


Дата: Июл 25, 2003 02:19:53

Ещё вариант:
; Check whether str1 is a substring of str2:
; str1 should always be in uppercase
; ---------------------------------
; Returns: No  - 0
;          Yes - other
; ESI points to substring
; =================================
IsSubStr PROC str1:DWORD,str2:DWORD
 mov esi,str2
 mov edi,str1
 xor eax,eax
 xor ecx,ecx
 cld
@@:
 lodsb
 test eax,eax
 jz _endloop            ; no match
 mov cl,BYTE PTR [edi]
 jecxz _endloop         ; match!
 inc edi
 cmp eax,ecx
 je @B
 add al,32
 cmp eax,ecx
 je @B
 mov edi,str1
 jmp @B
_endloop:
 sub edi,str1
 sub esi,edi
 ret
IsSubStr ENDP


Дата: Июл 25, 2003 04:28:16

PING
Ваш вариант может вызвать GPF.


Дата: Июл 25, 2003 15:44:12

А при желании, можно упомянуть ещё и Бойера с Муром... ;)


Дата: Июл 25, 2003 23:55:34

;FASM

include '%include%/win32ax.inc'
.data
templ db 'best' ;4
txt db 'Assembler is the best language' ;30
.code
start:
mov edx,txt
mov eax,30 ;3
mov edi,templ
mov ebp,4
;_________________________________
; ВХОД:
; edx= начальный адрес области памяти, где ищем
; eax= длина области поиска, byte
; edi= адрес образца искомой строки
; ebp= длина образца искомой строки, byte

; ВЫХОД:
; ZF=1 строка найдена, ZF=0 строка не найдена
; edx= адрес первого байта вхождения строки
; esi= адрес байта следующего за последним байтом вхождения строки
; edi= сохраняется адрес образца
; ebp= сохраняется длина образца искомой строки, byte
;__________________________________
sub eax,ebp ;искать ли вообще?
neg eax
jg endsearch ;искать нет смысла: область поиска < длины строки, установить ZF=0
;собственно поиск:
@@:
mov ecx,ebp
mov esi,edx
push edi ;сохранить адрес образца
repe cmpsb
pop edi ;восстановить адрес образца
jz endsearch ;найдено, ZF=1
inc eax ;проверить искать ли дальше
jg endsearch ;не найдено, ZF=0
inc edx ;новый адрес начала поиска
jmp @b ;новый поиск
endsearch:
;___________________________________


jnz @F
mov [esi], byte 0
invoke MessageBox,HWND_DESKTOP,edx,'стокa есть',MB_OK
jmp exit
@@:
invoke MessageBox,HWND_DESKTOP,':-( ','такой строки нет',MB_OK
exit:
invoke ExitProcess,0
.end start


Дата: Июл 26, 2003 19:39:57

Советую пойти сюда: http://board.win32asmcommunity.net/ и в поиске набрать InString.

Boyer Moore


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069