Поиск строки

Тема в разделе "FASM", создана пользователем Demon13, 28 ноя 2018.

  1. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Здравствуйте! На сайте(https://forum.sources.ru/index.php?showtopic=148078) нашёл код и подкорректировал под свои нужды.
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3. include 'C:\FASM\INCLUDE\WIN32AX.INC'
    4. section ".data" data readable writeable
    5. path db "HELLOWORLD", 0
    6. world db "WORLD",0
    7. a1 db ?
    8. a2 db ?
    9. section ".code" code readable executable
    10. proc search,_baseadr,_stradr,_basel,_strl
    11.     pushad
    12.     cld
    13.     mov edi,[_baseadr]    
    14. .NXTSE:
    15.     mov esi,[_stradr]    
    16.     mov ecx,[_basel]
    17.     mov al,byte[esi];
    18.     dec edi
    19.  
    20.     repnz scasb
    21.     jne .SEARTH_ERROR
    22.     mov esi,[_stradr]
    23.     mov ecx,[_strl]      
    24.     repz cmpsb
    25.     jne .NXTSE
    26.     mov eax,edi
    27.     sub eax,[_strl]
    28.     mov [resylt],eax
    29.     jmp .EXT
    30.  
    31. .SEARTH_ERROR:
    32.     mov [resylt],0
    33.     invoke MessageBox, 0, "Error", "Error", MB_OK
    34. .EXT:
    35.     popad
    36.     mov eax,[resylt]
    37.     ret
    38.     resylt dd 0
    39. endp
    40. start:
    41.       invoke lstrlen, path
    42.       mov eax, a1
    43.       invoke lstrlen, world
    44.       mov eax, a2
    45.       stdcall search, path, goo, a1, a2
    46.       invoke ExitProcess,0
    Процесс выполнения стопорится на repnz scasb. Почему так происходит?
     
    Последнее редактирование модератором: 29 ноя 2018
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Ты 3 и 4 аргументом указатели передаешь на a1 и a2, и используешь как счетчики для scasb и cmpsb. Вот cmpsb у тебя и уезжает в неведомые дали. После lstrlen'ов наверное сохранять туда надо eax (и в дворд, а не байт), а не помещать опять же в eax указатель. И передавать значения, а не указатели.
    --- Сообщение объединено, 28 ноя 2018 ---
    В фасме метка без ничего - указатель. В квадратных скобках [] - значение. Тип перед квадратными скобками BYTE/WORD/DWORD - если тип неопределен или не тот, какой надо. db - байт (byte), dw - слово (word), dd - двойное слово (dword). С комплектом win*x.inc макросов у invoke'ов stdcall'ов и прочего есть префикс addr чтоб адрес передавать (не абсолютный, на аргумент или локальную переменную или любое что-нибудь, адресуемое через регистр или регистр+смещение, через lea edx,[...])
     
    Demon13 нравится это.
  3. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Почему eax надо сохранять именно в dword?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Сохранять ворд на 1 байт кода дороже, а 1 байт это несерьезно :nea:lstrlenA дворд возвращает, всё говорит в пользу дворда.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Demon13,

    > Почему eax надо сохранять именно в dword?

    Хороший вопрос. Попытайтесь сохранить в word и спросите почему не получается.

    f13nd,

    Зачем вы решаете примитивные задачи за ньюби, это не помощь им.
     
    Mikl___ нравится это.
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Я вообще вопросов на форумах почти никогда не задаю и не понимаю зачем это делают. Зато прекрасно знаю, что мои философские наставления без опыта, на который они опираются, ни в хер ни кому не впились. Интересуется человек - объяснить нетрудно. Зачем ему это нужно - его дело.