поиск str in str

Тема в разделе "WASM.ASSEMBLER", создана пользователем pikador, 9 апр 2007.

  1. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Подскажите плиз как можно осуществить поиск
    одной строчки внутри другой?
    причем не важна позиция искомой строчки, важен сам факт ее нахождения...
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    1) тупо: cmpsb - ищешь первый символ, дальше посимвольное сравнение.
    2) были какие-то специальные алгоритмы для поиска подстрок, кажется с хешированием чето связано
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    главное за пределы строки не вылезать.
     
  4. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Извени, а исходники есть?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если интересует реализация - BMSearch (алгоритм Бойера-Мура) & K°. Если теория — гугли по сабжу: материала много, в т.ч. и русскоязычного (тот же АлгоЛист).
     
  6. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    гы, вот теории как раз не над.... Инфы действительно навалом, но никак не на ассемблере...
    Что неужели ни у кого нет?

    ЗЫ:
    Как сравнить полученную текстовую строчку с текстовой переменной?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    cmpsb
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    repe/repne cmpsb в есх длина построки в esi edi указатели на строки, которые надо сравнить
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. mov esi, offset buf1
    2. mov edi, offset buf2
    3. mov ecx, buf_len
    4. repe cmpsb
    5. test ecx, ecx
    6.  
    7. jnz test_failed
    8.  
    9. ; test ok
    10. jmp done
    11.  
    12. test_failed:
    13. ; test failed
    14.  
    15. done:
    16.  
    17. ...
    18.  
    19. buf1 db 'Hello, World', 0
    20. buf_len equ $-buf1
    21. buf2 db 'Hello, world!, 0
    Можно даже без TEST ECX,ECX - CMPSB ставит ZF
     
  10. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    ммм.... спасибо!
    А что может вызвать такой вот запрет:
    на:
    Код (Text):
    1. 330:        push offset sig_f1
    2. 331:        call lstrlenA@4
    3. 332:
    4. 333:        Mov ecx, eax
    5. 334:        Mov esi, offset sig_f1
    6. 335:        Mov edi, offset fin.nam
    7. 336:        Rep cmpsb
    8. 337:        
    9. 338:        cmp eax,0
    10. 339:        jne NO
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    OMG, какой смысл сравнивать через cmpsb если длину счиатешь через lstrlenA?))))
    Юзай тогда уж и lstrcmpA для сравнения
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    pikador
    Надо же. А в папку масма заглядывал?
     
  13. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Ок, использую, все работает на ура!
    А как быть если мне над не сравнить, а найти где нить внутри др.строчке?

    На Rep cmpsb орет.....
    Да и то что написал Great, сравнение, а не поиск, или я ошибаюсь? сравнение там с 1го бита...
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    strstr
    дык ты и спрашивал сравнение))
     
  15. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Ок, че для нее подключить надо?

    ЗЫ:Great, классный чувак, скоко вопросов не задавал, всегда один из первых отвечает, да и по делу! Респект)))
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    она в libc лежит. это стандартная CRT (c rumtime)
     
  17. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    бр.....
    Код (Text):
    1.  pr.obj : error LNK2001: unresolved external symbol _strstrA@8
    а что тогда не так?

    Вот инклуды:
    Код (Text):
    1. includelib \masm32\lib\user32.lib
    2. includelib \masm32\lib\kernel32.lib
    3. includelib \masm32\lib\shlwapi.lib
    4. include    \masm32\include\shlwapi.inc
    5.  
    6. include \masm32\include\shell32.inc
    7. includelib \masm32\lib\shell32.lib
    8. ;-----------------------------------------
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pikador
    Для shlwapi.lib надо писать с учетом регистра StrStr.
     
  19. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Спасибо, один вопрос: строчку она ищет с учетом регистра или нет?
     
  20. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    repe/repne cmpsb - это так, для справки :)