Определение нужной строки

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 15 окт 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Необходимо определить в конце строки наличие '-s'. Длина строки неизвестна.
    Почему не работает следующий код?
    Код (Text):
    1.      cld
    2.      mov    esi,eax ;eax - указатель на строку
    3. nextletter:
    4.      lodsb
    5.      cmp    al,2DH
    6.      je     @F
    7.      test   al,al
    8.      jz     endstr
    9.      jmp    nextletter
    10. @@:
    11.      lodsb
    12.      cmp    al,53H
    13.      je     @F
    14.      test   al,al
    15.      jz     endstr
    16.      jmp    nextletter
    17. @@:
    18.      invoke MessageBox,hwnd,addr ok,0,MB_OK
    19. endstr:
    Может кто-нибудь знает другой способ решения данной задачи?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Получить длину строки с помощью lstrlen, сравнить последний ворд с 's-'.

    [добавлено]

    invoke lstrlen,ebx ;в ebx - указатель (так проще)
    add ebx,eax
    cmp word ptr [ebx-2],'s-'

    Я бы так сделал...
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Может потому что 53H - это код большой "S", а не маленькой?
    А вообще в таких случаях INT3 перед cld и все это дело в OllyDbg.
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Поэтому, в любом случае, лучше сравнивать с аски-значением ( '-','s' ), компилятор подставит нужное..
     
  5. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Aspire
    Код (Text):
    1. invoke lstrlen,ebx   ;в ebx - указатель (так проще)
    2. add ebx,eax
    3. cmp word ptr [ebx-2],'s-'
    То, что нужно. Только, можно пояснить зачем add ebx,eax?
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vg
    :) А зачем lstrlen тогда вообще?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    vg
    'jmp nextletter' во второй части, где идет сравнение с 'S' замени на 'jmp @B'. А вообще, IMHO логичнее сделать так:
    Код (Text):
    1.  mov esi, eax
    2. .l00p:
    3.  lodsb
    4.  cmp al, 0x2D
    5.  jnz @F
    6.  lodsb
    7.  cmp al, 0x53
    8.  jz .found
    9. @@:
    10.  or al, al
    11.  jz .not_found
    12.  jmp .l00p
    13.  
    14. .found:
    15.  ;Найдено. Делаешь, что нужно
    16.  jmp @F
    17. .not_found:
    18.  ;Не найдено. Делаешь, что нужно
    19. @@:
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    ИМХО совсем не логично. Ваш код найдет первое вхождение "-S" в строку, а не "определит в конце строки наличие '-s' ", как в постановке задачи.
    Самый логичный вариант, опять таки ИМХО, - тот, который предложил Aspire.