Примитивный алгоритм поиска подстроки в строке

Тема в разделе "WASM.BEGINNERS", создана пользователем _Juicy, 17 янв 2010.

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    spa
    вы вот это подпрограмму откомпильте без самодеятельности
    Код (Text):
    1. int substr(char* str, char* sub)
    2. {
    3.   int i,j;
    4.   for (i=0, j=0; str[i+j]&&sub[j]; (str[i+j]==sub[j])?j++:j=++i-i);
    5.   return sub[j]?-1:i;
    6. }
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. .text:00401000 ; int __stdcall substr(char *str, char *sub)
    2. .text:00401000 ?substr@@YGHPAD0@Z proc near            ; CODE XREF: _main+Ap
    3. .text:00401000
    4. .text:00401000 str             = dword ptr  4
    5. .text:00401000 sub             = dword ptr  8
    6. .text:00401000
    7. .text:00401000                 push    esi
    8. .text:00401001                 mov     esi, [esp+4+str]
    9. .text:00401005                 xor     eax, eax
    10. .text:00401007                 xor     ecx, ecx
    11. .text:00401009                 push    edi
    12. .text:0040100A                 mov     edi, [esp+8+sub]
    13. .text:0040100E                 cmp     [esi], al
    14. .text:00401010                 jz      short loc_401032
    15. .text:00401012                 push    ebx
    16. .text:00401013
    17. .text:00401013 loc_401013:                             ; CODE XREF: substr(char *,char *)+2Fj
    18. .text:00401013                 mov     dl, [ecx+edi]
    19. .text:00401016                 test    dl, dl
    20. .text:00401018                 jz      short loc_401031
    21. .text:0040101A                 lea     ebx, [ecx+eax]
    22. .text:0040101D                 cmp     [ebx+esi], dl
    23. .text:00401020                 jnz     short loc_401025
    24. .text:00401022                 inc     ecx
    25. .text:00401023                 jmp     short loc_401028
    26. .text:00401025 ; ---------------------------------------------------------------------------
    27. .text:00401025
    28. .text:00401025 loc_401025:                             ; CODE XREF: substr(char *,char *)+20j
    29. .text:00401025                 inc     eax
    30. .text:00401026                 xor     ecx, ecx
    31. .text:00401028
    32. .text:00401028 loc_401028:                             ; CODE XREF: substr(char *,char *)+23j
    33. .text:00401028                 lea     edx, [ecx+eax]
    34. .text:0040102B                 cmp     byte ptr [edx+esi], 0
    35. .text:0040102F                 jnz     short loc_401013
    36. .text:00401031
    37. .text:00401031 loc_401031:                             ; CODE XREF: substr(char *,char *)+18j
    38. .text:00401031                 pop     ebx
    39. .text:00401032
    40. .text:00401032 loc_401032:                             ; CODE XREF: substr(char *,char *)+10j
    41. .text:00401032                 cmp     byte ptr [ecx+edi], 0
    42. .text:00401036                 pop     edi
    43. .text:00401037                 pop     esi
    44. .text:00401038                 jz      short locret_40103D
    45. .text:0040103A                 or      eax, 0FFFFFFFFh
    46. .text:0040103D
    47. .text:0040103D locret_40103D:                          ; CODE XREF: substr(char *,char *)+38j
    48. .text:0040103D                 retn    8
    49. .text:0040103D ?substr@@YGHPAD0@Z endp
    В логике неохото разбираться, ондако на первый взгляд нет sub'ов
    ms vc 2008
     
  3. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    loc_401025 - я так понимаю, это оно. вычитания действительно нет о_О какой уровень оптимизаций?
     
  4. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    gcc -O1
    Код (Text):
    1. .text:00401390 sub_401390      proc near               ; CODE XREF: sub_4013DA+20p
    2. .text:00401390                                         ; sub_4013DA+36p ...
    3. .text:00401390
    4. .text:00401390 arg_0           = dword ptr  8
    5. .text:00401390 arg_4           = dword ptr  0Ch
    6. .text:00401390
    7. .text:00401390                 push    ebp
    8. .text:00401391                 mov     ebp, esp
    9. .text:00401393                 push    edi
    10. .text:00401394                 push    esi
    11. .text:00401395                 push    ebx
    12. .text:00401396                 mov     edi, [ebp+arg_0]
    13. .text:00401399                 mov     ecx, [ebp+arg_4]
    14. .text:0040139C                 mov     ebx, 0
    15. .text:004013A1                 mov     esi, 0
    16. .text:004013A6                 jmp     short loc_4013B5
    17. .text:004013A8 ; ---------------------------------------------------------------------------
    18. .text:004013A8
    19. .text:004013A8 loc_4013A8:                             ; CODE XREF: sub_401390+34j
    20. .text:004013A8                 cmp     al, dl
    21. .text:004013AA                 jnz     short loc_4013AF
    22. .text:004013AC                 inc     ebx
    23. .text:004013AD                 jmp     short loc_4013B5
    24. .text:004013AF ; ---------------------------------------------------------------------------
    25. .text:004013AF
    26. .text:004013AF loc_4013AF:                             ; CODE XREF: sub_401390+1Aj
    27. .text:004013AF                 inc     esi
    28. .text:004013B0                 mov     ebx, 0
    29. .text:004013B5
    30. .text:004013B5 loc_4013B5:                             ; CODE XREF: sub_401390+16j
    31. .text:004013B5                                         ; sub_401390+1Dj
    32. .text:004013B5                 lea     eax, [edi+ebx]
    33. .text:004013B8                 mov     al, [eax+esi]
    34. .text:004013BB                 test    al, al
    35. .text:004013BD                 jz      short loc_4013C8
    36. .text:004013BF                 mov     dl, [ecx+ebx]
    37. .text:004013C2                 test    dl, dl
    38. .text:004013C4                 jnz     short loc_4013A8
    39. .text:004013C6                 jmp     short loc_4013D3
    40. .text:004013C8 ; ---------------------------------------------------------------------------
    41. .text:004013C8
    42. .text:004013C8 loc_4013C8:                             ; CODE XREF: sub_401390+2Dj
    43. .text:004013C8                 cmp     byte ptr [ecx+ebx], 0
    44. .text:004013CC                 jz      short loc_4013D3
    45. .text:004013CE                 mov     esi, 0FFFFFFFFh
    46. .text:004013D3
    47. .text:004013D3 loc_4013D3:                             ; CODE XREF: sub_401390+36j
    48. .text:004013D3                                         ; sub_401390+3Cj
    49. .text:004013D3                 mov     eax, esi
    50. .text:004013D5                 pop     ebx
    51. .text:004013D6                 pop     esi
    52. .text:004013D7                 pop     edi
    53. .text:004013D8                 leave
    54. .text:004013D9                 retn
    55. .text:004013D9 sub_401390      endp
     
  5. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    может тему в A&O уже перенести?