FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 17:22Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Поиск , используя ASM вставки
haavДата: Пятница, 15.06.2012, 12:58 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Поиск , используя ASM вставки


Этот код я написал уже давненько. Обычный поиск путем сравнения каждого символа. Да алгоритм не очень. На самом деле просто хотелось написать эту функцию и сравнить с имеющейся в FreeBasic INSTR. Результат конечно разочаровал меня, но все таки при поиске в небольших объемах текста FindString быстрее чем INSTR. Но на больших отстает , при том заметно!

Code
Function FindString(ByVal dest As String, ByVal search As String, ByVal pos_ As Integer) As Integer Export
         Dim As Integer return__
         Dim As Integer ptr return_=@return__,add_=@pos_
          
         Asm
                 push ebp  
                 mov edi,[add_]  
                 push edi         
                 mov edi,[return_]  
                 push edi  
                 mov edx,[dest]
                 Add edx,[pos_]
                 dec edx  
                 mov ebx,[search]
                 Xor edi,edi  
                 Xor esi,esi  
                 Xor ebp,ebp  
                 mov ecx,-1  
                 main:
                 mov al,[ebx+esi]  
                 mov ah,[edx+edi]  
                 cmp al,0  
                 jz finish  
                 cmp ah,0    
                 jz finish
                 cmp al,ah  
                 jz Yes  
                 cmp ebp,0  
                 jz ret__
                 mov edi,ebp                 
                 ret__:
                 Xor ebp,ebp  
                 Xor esi,esi  
                 inc edi  
                 jmp No_  
                 Yes:  
                 cmp ebp,0  
                 jnz EBPNONULL  
                 mov ebp,edi  
                 inc ebp
                 EBPNONULL:
                 inc edi
                 inc esi
                 No_:
                 loop main  
                 finish:  
                 cmp ebp,0
                 jz Err
                 Not ecx         
                 jmp Valid
                 Err:
                 pop eax
                 pop ebx
                 mov [eax],ebp         
                 jmp END_
                 Valid:                 
                 pop eax
                 pop ecx
                 Add ebp,[ecx]
                 dec ebp
                 mov [eax],ebp
                 END_:
                 pop ebp
         End Asm
         Return return__
End Function
Print FindString("FreeBasic","Bas",1):Sleep
  


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: