Самое длинное слово (в словаре)

Тема в разделе "WASM.A&O", создана пользователем bogrus, 2 авг 2005.

  1. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Массив со словами (словарь паролей короче), каждое заканчиваются возвратом каретки (0x0D0A), вот пример:
    Код (Text):
    1. 31 32 33 34 35 36 37 38 0D 0A 61 62 63 64 65 66 12345678..abcdef
    2. 0D 0A 41 42 43 44 45 46 0D 0A 31 32 24 33 34 35 ..ABCDEF..12$345
    3. 36 37 38 61 20 62 63 64 65 66 41 42 43 2A 44 45 678a bcdefABC*DE
    4. 46 7E 0D 0A                                     F~..
    Найти длину самого длинного слова, вот "исходник":
    Код (Text):
    1. ;========================================
    2.             stdcall longword,buffer,size
    3. ;========================================
    4. longword:   push    ebx
    5.             mov     ebx,[esp+8]
    6.             add     [esp+12],ebx
    7.             mov     ecx,ebx
    8.             or      eax,-1
    9. @@:         cmp     byte[ebx],0x0f
    10.             lea     ebx,[ebx+1]
    11.             jnc     @b
    12.             sub     ecx,ebx
    13.             sub     ecx,eax
    14.             sbb     edx,edx
    15.             and     edx,ecx
    16.             inc     ebx
    17.             add     eax,edx
    18.             cmp     ebx,[esp+12]
    19.             mov     ecx,ebx
    20.             jc      @b
    21.             not     eax
    22.             pop     ebx
    23.             retn    8
    24. ;========================================
     
  2. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Очень интересно. А в чем суть вопроса?



    ;========================================

    stdcall longword,buffer,size

    ;========================================

    longword: mov edx,[esp+4]

    dec edx

    add [esp+8],edx

    mov ecx,edx

    or eax,-1

    @@: inc edx

    cmp word[edx],0A0Dh

    jne @b

    sub ecx,edx

    cmp ecx,eax

    jae @1

    mov eax,ecx

    @1: inc edx

    mov ecx,edx

    cmp edx,[esp+8]

    jc @b

    not eax

    retn 8



    Так доходчивей, короче, правильней, и регистров меньше используется.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Почему 0x0f ?
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    dr_dred




    Ни в чем, я сделал для себя решение, а потом ним поделился, потому что не понравилось



    cresta




    Да там можно любое, что больше 0x0D, просто с jnz у меня почему-то чуть дольше получалось
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dr_dred



    Разве это плюс? Если задействовать один дополнительный регист (esi сам просится :), можно выйграть ещё минимум 3 байта в размере и немного в скорости.
     
  6. dr_dred

    dr_dred Сергей

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

    Мне Ваше решение понравилось:) Доходил в отладчике.

    Так можно еще:



    ;========================================
    Код (Text):
    1. longword:   mov     edx,[esp+4]
    2.             add     [esp+8],edx
    3.             xor     eax,eax
    4.             or      ecx,-1
    5.             .repeat
    6.                .repeat
    7.                   inc   ecx
    8.                .until   word [edx+ecx]=0A0Dh
    9.                .if      ecx>eax
    10.                   mov   eax,ecx
    11.                .endif
    12.                lea      edx,[edx+ecx+2]
    13.                or       ecx,-1
    14.             .until      edx>=[esp+8]
    15.             retn 8


    ;========================================

    то же что и

    ;========================================
    Код (Text):
    1. longword:   mov     edx,[esp+4]
    2.             add     [esp+8],edx
    3.             xor     eax,eax
    4.             or      ecx,-1
    5. @@:         inc     ecx
    6.             cmp     word[edx+ecx],0A0Dh
    7.             jne     @b
    8.             cmp     ecx,eax
    9.             jna     @1
    10.             mov     eax,ecx
    11. @1:         lea     edx,[edx+ecx+2]
    12.             or      ecx,-1
    13.             cmp     edx,[esp+8]
    14.             jb      @b
    15.             retn    8
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Лучше б на С написал. ;)
     
  8. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Пользуясь случаем. Когда-то в HEAP была тема "Самозарождение вирусов", и кто-то написал там код, размножающий себя в памяти.

    Иногда, отлаживая программу в OllyDbg, отладка начинается не с первой команды программы, а раньше, и тогда видно, что вызов процедуры start идет так:

    call dword ptr [ebp+8]

    Пользуяь этим:
    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32axp.inc'
    3. section '.code' code readable writeable executable
    4. start:
    5.     mov esi,[ebp+8]
    6.     mov ecx,10h
    7.     lea edi,[esi+ecx]
    8.     add dword [ebp+8],ecx
    9.     rep movsb
    10. .end start


    ?
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. pas_len:
    2.     push    ebp
    3.     xor     ebp,ebp
    4.     mov     esi,[esp+12]
    5.     mov     edi,-235802126
    6.     add     esi,[esp+8]
    7. _s: mov     eax,[esp+8]
    8.     lea     edx,[eax+3]
    9. _l: cmp     eax,esi
    10.     jge     _r
    11.     mov     ecx,edi
    12.     mov     ebx,[eax]
    13.     add     ecx,ebx
    14.     not     ebx
    15.     and     ecx,2155905152
    16.     and     ecx,ebx
    17.     jnz      _4
    18.     mov     ecx,edi
    19.     mov     ebx,[eax+4]
    20.     add     ecx,ebx
    21.     not     ebx
    22.     and     ecx,2155905152
    23.     and     ecx,ebx
    24.     jnz      _8
    25.     mov     ecx,edi
    26.     mov     ebx,[eax+8]
    27.     add     ecx,ebx
    28.     not     ebx
    29.     and     ecx,2155905152
    30.     and     ecx,ebx
    31.     jnz      _12
    32.     mov     ecx,edi
    33.     mov     ebx,[eax+12]
    34.     add     ecx,ebx
    35.     add     eax,16
    36.     not     ebx
    37.     and     ecx,2155905152
    38.     and     ecx,ebx
    39.     jz      _l
    40.     jmp     _z
    41. _12:add     eax,4
    42. _8: add     eax,4
    43. _4: add     eax,4
    44. _z: test    ecx,32896
    45.     jnz     @F
    46.     shr     ecx,16
    47.     add     eax,2
    48. @@: shl     cl,1
    49.     sbb     eax,edx
    50.     add     [esp+8],eax
    51.     add     dword ptr[esp+8],2
    52.     cmp     eax,ebp
    53.     jle     _s
    54.     mov     ebp,eax
    55.     jmp     _s
    56. _r: mov     eax,ebp
    57.     pop     ebp
    58.     retn    8
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bogrus

    Если не забывать о P4, то вместо sbb лучше использовать cdq (с небольшими изменениями)