Поиск строки

Тема в разделе "WASM.WIN32", создана пользователем Valentin, 19 дек 2008.

  1. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Есть файл с данными:

    0`20.12.08*
    1`Р22`15,555*
    2`Л89А`68,333*

    Если нашли Р22, то нужно значение 15,555 сохранить в буфер для дальнейшего использования.

    Р22 -нашел, как быть дальше???
    ==================================

    .data
    SV db 'Р22',0
    SVLen=$-SV
    .data?

    pMemory DWORD ?
    SizeWritten DWORD ?
    FILERp DWORD ?


    FindStr PROC NEAR uses esi edi ecx

    cld
    mov ecx,[SizeWritten] ; размер строки
    mov edi,[pMemory]; здесь строка
    mov al,SV ;P[0]->al
    next_SV:
    lea esi,SV
    inc esi ;на следующий символ
    repne scasb ;нет символов
    jcxz exSV ; на выход
    push ecx
    mov ecx,SVLen-1
    repe cmpsb
    ;строка p <> подстроке в s
    cmp ecx,0 ;если подстрока совпала
    jnz @@SV ;выходим
    ; ---------------------;здесь нашли
    @@SV:
    mov ebx,SVLen-1
    sub ebx,ecx
    pop ecx
    sub ecx,ebx ;учли пройденное при сравнении cmpsb
    jmp next_SV
    exSV:
    xor eax, eax
    ret

    FindStr endp
    ===============================
    Заранее благодарен за ответы.
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    15,555 - это строка в файле, а не число. Поэтому в буфер надо будет сохранять строку. Пропускаешь символ кавычки (') и считываешь байты, пока не встретишь *.
     
  3. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Считать байты-это понятно, как их сцепить?? (1+5+,+.....)
    Если можна, пример продолжения кода.
     
  4. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Сделал, получилось.
    И еще вопрос:

    Как можно передать в ф-цию FindStr SV и SVLen в виде параметров? что-бы обращаться к ней из других модулей.

    SV db 'Р22',0
    SVLen=$-SV
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    push offset SV
    push SVLen
     
  6. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Спасибо, попробую.
     
  7. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    Вот теперь после переделки работает такой вариант:



    Код (Text):
    1. .data
    2.  
    3.     SV      db 'Р22',0
    4.     PAR     db 'Р22',0
    5.  
    6.  
    7. .code
    8. FindStr PROC  uses esi edi ecx SV0 :DWORD
    9. LOCAL ln    :DWORD
    10.     invoke lstrlen,offset SV
    11.     mov ln ,eax
    12.  
    13.     invoke lstrlen,buffOUT
    14.     cld
    15.     mov ecx,eax
    16.     mov edi,buffOUT
    17.     push    ecx
    18.     mov al,[b]SV[/b]    ;P[0]->al
    19. next_SV:
    20.     lea esi,[b]SV[/b]
    21.     inc esi ;на следующий символ
    22.     repne   scasb ;нет символов
    23.     jcxz    exSV ; на выход
    24.     push    ecx
    25.     mov ecx,ln
    26.     repe    cmpsb
    27.     ;строка p <> подстроке в s
    28.     cmp ecx,0 ;если подстрока совпала
    29.     jnz @@SV ;выходим
    30.     add flagED,1
    31.     inc esi ;на следующий символ
    32.     mov buffOUT,edi
    33.            
    34. @@SV:
    35.     mov ebx,ln
    36.     sub ebx,ecx
    37.     pop ecx
    38.     sub ecx,ebx ;учли пройденное при сравнении cmpsb
    39.     jmp next_SV
    40. exSV:
    41.     xor eax, eax
    42.     ret
    43.  
    44. FindStr endp
    работает с SV, а мне нужно, вызывать ф-цию с параметром SVO

    invoke FindStr,PAR
    правильно передать параметр c указателем на строку не получается.

    ----------------
    mov al,SV0 ;P[0]->al
    next_SV:
    lea esi,SV0
    -----------------