Поиск в строке scasd

Тема в разделе "WASM.BEGINNERS", создана пользователем dgs, 12 июн 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Привет всем. Смотрел по инету примеров куча и многие из них хорошие, только вот на scasd не все богаты в общем накатал во:

    Код (Text):
    1.         cld
    2.         mov     edi, [buffer]  
    3.         mov     ecx, 4096
    4.         mov     eax, 13101310        
    5.         repe    scasd                    
    6.         mov     eax, edi
    7.         sub     eax, [buffer]
    Не совсем понятно, по идеи один проход scasd инкрементирует edi и в результате выполнения кода мы получаем кол-во символов до искомой комбинации, ведь так? И в eax хочу отправить db 13, 10, 13, 10 тока сдается будет это записано не так как я вписал
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Код (Text):
    1.         cld
    2.         mov     edi, [buffer]  
    3.         mov     ecx, 4096
    4.         mov     eax, 0D0A0D0Ah        
    5.         repe    scasd                     ;пока равно? Вы уверены
    6.         lea      eax, [edi-buffer]
    7.         sub     eax, [buffer]
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    да и последнюю команду удалите. забыл.
    offtop: верните редактирование!
     
  4. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    fasm ругается...

    Не не уверен. наверно repne

    Что то вообще бред какой-то получается, я такой буфер не выделяю, что бы такие результаты получались...
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Код (Text):
    1. cld ; задали порядок от начала к концу (инкремент)
    2. mov edi, buffer ; взяли указатель на буфер
    3. mov ecx, 4096 ; длина буфера (повторений)
    4. mov eax, 0D0A0D0Ah ; искомая подстрока
    5. repe scasd ; пока равно ищем не соответствующий кусок
    6. lea eax, [edi-buffer] ; вычисляем позицию в буфере + 4
    по поводу: FASM ругается - весь код пожалуйста (желательно файлом)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    max7C4
    очепятка
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    кстати к ТС - а ты уверен, что искомые символы будут идти по смещению от начала буфера, кратному 4?
     
  8. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    А FASM это реально понимает?
    Это количество повторений. Учитывая то, что используется
    буфер равен
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    MirrorBlack
    да понимает. и даже что-то вроде lea eax, [eax*9-999]
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    MSoft
    скорее всего он надеется что это реагирует на совпадение хотя бы одного байта. т.е. данные находятся кратно 2 байтам.
    и насчет очепятки. как раз нет
    repe scasd - порторять пока установлен zf сравнивать eax и [es:edi] и увеличивать edi на 4
    т.е. остановиться при не соответствии
    repne scasd - порторять пока сброшен zf сравнивать eax и [es:edi] и увеличивать edi на 4
    т.е. остановиться при соответствии
     
  11. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    max7C4
    Очередное доказательство того, что FASM - гуано. Мне очччень интересно посмотреть как будет работать DLL с таким кодом.
    Ты хочеш сказать что FASM это разложит на:
    lea eax, [eax*8+eax+(-999)] ?

    Жаль jaja забанили, он бы про FASM ещё и не такое рассказал :)
     
  12. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Код (Text):
    1. proc GetHeaderLenght buffer
    2.         cld
    3.         mov     edi, [buffer]
    4.         mov     ecx, 1024                ; Исправил
    5.         mov     eax, 0A0D0A0Dh        
    6.         repne   scasd                     ; А вот самое интересное, адрес комбинации которую
    7.                                                ; я ищу не кратен 4 по отношению адреса buffer
    8.  
    9. ;lea eax, [edi-buffer] Херов тут так будет понимать
    10.  
    11.         mov     eax, edi
    12.         sub     eax, [buffer]
    13.         ret
    14. endp
    А scasd инкрементирует edi или делает add edi, 4 ?
     
  13. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Короче вот:

    Код (Text):
    1. proc GetHeaderLenght buffer
    2.         cld
    3.         mov     edi, [buffer]
    4.         mov     ecx, 4096
    5.         mov     eax, 0A0D0A0Dh
    6.  
    7. .find$0D:
    8.         repne   scasb
    9.  
    10.         cmp     ecx, 3
    11.         jb      .notFound
    12.  
    13.         cmp     [edi-1], eax
    14.         jne     .find$0D
    15.  
    16.         add     edi, 3
    17.  
    18. .exit:
    19.         mov     eax, edi
    20.         sub     eax, [buffer]
    21.  
    22.         ret
    23.  
    24. .notFound:
    25.         lea     edi, [edi+ecx]
    26.         jmp     .exit
    27. endp
    Все решено, всем спасибо...
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    max7C4
    да, точно, это я ошибся - не так коментарий прочитал
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    MirrorBlack
    Обалдеть. Очевидные преимущества FASM'а умудряться выставить, как недостатки. Да. Понимает. Какие проблемы? Разумеется, что buffer не должен быть локальной переменной. И в dll понимает. И опять-таки, очевидно, что только в том случае, если dll не имеет релоков. Иначе будет выдана ошибка компиляции.
    И уж точно MASM'у это далеко не в плюс, если ему ума не хватает скомпилировать элементарнейшую конструкцию, необходимость в которой лично у меня не один и не два раза возникала.
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    MirrorBlack
    Да. Именно так он и сделает для конструкции вида, например, lea eax, [eax*9-buffer]. Очередной плюс FASM'у.
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    MirrorBlack
    поясните. почему dll с этим кодом не должна работать или что с ней должно случиться.
    да.
     
  18. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Все ребят тема закрыта, пишите на чем вам нравится и нет вопросов...