оптимизация asm кода

Тема в разделе "WASM.BEGINNERS", создана пользователем Hellspawn, 4 фев 2006.

  1. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    вот собственно - это вставка в дельфях...

    MEMSZ - размер памяти

    MEMPTR - указатель

    cmp ecx,0h - проверка на конец буфера...

    ищу вхождение 3-ёх байт $DB $87 $DB

    в конце будет адресс в c1...

    вот как можно оптимизировать это всё =\

    а то мои скромные познания в асме не позволяют

    больше ничё сделать...
    Код (Text):
    1.  
    2.   asm
    3.     pushad
    4.     mov ecx,MEMSZ
    5.     mov eax,MEMPTR
    6. @start:
    7.     cmp byte [eax],$DB
    8.     je @next
    9.     inc eax
    10.     loop @start
    11.     jmp @end
    12. @next:
    13.     inc eax
    14.     dec ecx
    15.     cmp ecx,0h
    16.     je @end
    17.     cmp byte [eax],$87
    18.     jne @start
    19.     inc eax
    20.     dec ecx
    21.     cmp ecx,0h
    22.     je @end
    23.     cmp byte [eax],$DB
    24.     jne @start
    25.     mov c1,eax
    26. @end:
    27.     popad
    28.   end;
    29.  
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    pushad

    mov ecx,MEMSZ

    mov eax,MEMPTR

    @start:

    cmp byte ptr [eax],0DBh

    je @next1

    @next:

    inc eax

    loop @start

    jmp @end

    @next1:

    cmp word ptr [eax+1],0db87h

    jne @next

    mov c1,eax

    @end:

    popad
     
  3. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    спасибо за ответ =)

    вот пришлось чуть модифицировать код... для поиска

    определённых сигнатур...

    ногами плиз сильно не пинать....

    что тут можно оптимизировать для повышения скорости???
    Код (Text):
    1.  
    2. asm
    3. pushad
    4. lea eax,@sign1
    5. lea edx,@end
    6. sub edx,eax <-- получаем размер сигнатуры
    7. mov signsz,edx
    8. mov ecx,MEMSZ <-- размер буфера
    9. mov eax,MEMPTR <-- указатель на буфер
    10. jmp @start
    11. @st:
    12. mov ecx,_ecx <-- восстанавиваем зн-я счётчика
    13. mov eax,_eax <-- и указателя
    14. inc eax
    15. @start:
    16. cmp eax,maxadd <-- данные закончились??
    17. jae @end
    18. cmp byte [eax],$DB <-- первый байт
    19. je @next
    20. inc eax
    21. loop @start
    22. jmp @end
    23. @next:
    24. mov _ecx,ecx <-- сохранили зн-я счётчика
    25. mov _eax,eax <-- и указателя
    26. inc eax
    27. cmp byte [eax],$87 <-- второй байт
    28. jne @st
    29. dec eax
    30. mov count,0
    31. mov ebx,0
    32. mov ecx,signsz <-- размер сиг-ры
    33. lea edx,@sign1 <-- указатель на сиг-ру
    34. @find:
    35. cmp byte [edx],$FF <-- пропускаем если FF
    36. je @nextb
    37. mov bh,[edx]
    38. mov bl,[eax]
    39. cmp bh,bl <-- собственно сравниваем
    40. jne @nextb
    41. inc count <-- увеличиваем счётчик
    42. @nextb:
    43. inc eax
    44. inc edx
    45. loop @find
    46. cmp count,8 <-- совпало хотя бы 8 байт?
    47. jae @end
    48. jmp @st
    49. @sign1:
    50. DB $DB,$87,$33,$44,$55,$66,$77,$FF,$11,$22
    51. @end:
    52. mov c1,eax <-- сохраняем указатель
    53. popad
    54. end;
    55.