Работа со строками

Тема в разделе "WASM.BEGINNERS", создана пользователем calidus, 14 май 2007.

  1. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Есть ли функция стирания первой части и передвижения оставшейся на стертую,на начало допустим xxxxRAZDELITELxxxxx я затер первые X и стало 0000RAZDELITELxxxx
    и функция сдвигает до RAZDELITELxxxx на нули . Вроде это функция ltrim и rtrim но чего то они у меня не работают.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ltrim, rtrim и trim удаляют из строки крайние пробелы.
    Чтобы подвинуть часть строки, можно использовать memmove или strcpy
     
  3. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    strcpy да я думал об этом но просто этот буфер накопитель ,и постепенно спереди стирается часть , но когда я скопирую допустим то что надо оставшийся кусок затереть ведь сзади ,тоесть обнулить буфер а если у меня будет одновременно добавление то затирается то что добавилось или не туда добавляется ,тогда делать симофор ,но тогда это уже медленнее в скорости , есть мозет альтернативные методы
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    calidus
    1. для чего тебе затирать после копирования заднюю часть буфера? Какая необходимость в этом? strcpy поставит в конце строки ноль. Этого одного нолика достаточно, чтобы функции работы со строками остановились на этом нолике и дальше не лезли в конец буфера. Т.е. хвост буфера после ноля, вставляемого strcpy, будет невидим для строковых функций. И не нужно ничего сзади обнулять, тратя на это время.
    2. если всё-таки жизненно необходимо затереть нулями хвост буфера, то после копирования определи длину строки, и начиная от конца этой строки до конца буфера залей нулями при помощи RtlZeroMemory

    P.S.
    Кроме того, если тебе важна скорость, может исключить обнуление передней части? Просто запомнить длину, на которую необходимо сдвинуть строку.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Можно сделать примерно так:

    Код (Text):
    1. shift_string proc
    2.     push    esi
    3.     push    edi
    4.    
    5.     ;поиск первого ненулевого (начала строки)
    6.     lea     esi,buffer
    7.     mov     edi,esi
    8.     dec     esi
    9.  @@:
    10.     inc     esi
    11.     cmp     byte ptr[esi],0
    12.     je      @B
    13.    
    14.     ;перенос строки в начало буфера
    15.     mov     ecx,edi
    16.     add     ecx,sizeof buffer
    17.  @@:
    18.     mov     al,[esi]
    19.     mov     [edi],al
    20.     inc     esi
    21.     inc     edi
    22.     test    al,al
    23.     jnz     @B
    24.    
    25.     ;заполнение нулями хвоста буфера
    26.  @@:  
    27.     mov     byte ptr[edi],0
    28.     inc     edi
    29.     cmp     ecx,edi
    30.     jne     @B
    31.    
    32.     pop     edi
    33.     pop     esi
    34.     ret
    35.  
    36. shift_string endp
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    чуть не уписялся :) а lodsb/stosb никак?
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    MSoft

    Памперсы вам помогут ...

    mov al,[esi]
    mov [edi],al
    inc esi
    inc edi

    выполняется заметно быстрее, чем lodsb/stosb. А судя по посту #3 скорость приорететнее, чем размер.

    P.S.
    Например на моем процессоре цикл с mov al[esi] выполняется на 60% быстрее, чем цикл с lodsb. (208 тиков против 337 на строке длиной 60 символов)
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а
    тоже выполняется быстрее, чем
    Код (Text):
    1. xor eax,eax
    2. @@:
    3. scasb
    4. jnz @B
    ?

    П.С.: это ты сам замерял скорость? или по справочнику смотрел? жутко хочеца заглянуть в справочник, да шо-то найти его в инете не могу
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. @@:
    2.     inc     esi
    3.     cmp     byte ptr[esi],0
    4.     je      @B
    быстрее как и код cresta с mov al,[esi]..
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    MSoft

    цикл с cmp byte ptr[esi],0 быстрее, чем scasb

    Коль скоро я привел конкретные цифры, то видимо замерял...

    А справочников и пособий по оптимизации в инете - как грязи. Например, pentopt.pdf А.Фога или IA-32 Intel® Architecture Software Developer’s Manual в трех томах.
    Ищите.
     
  11. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Ого тут спор ))))))) Спасибо большое ВСем !!!!!!!! Буду пробовать!!!! Так вот , я бы все равно хотел узнать что тогда выполняют команды Ltrim Rtrim ???? или szRemove
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Дык уже говорили, что LTrim, RTtrim и Trim удаляют крайние пробелы в строке. Соответственно слева, справа и с обоих концов. szRemove удалает фрагмент строки
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    все, иду вешаться, мировозрение поломано :dntknw:
     
  14. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    hahaha ok! Pasib! Msoft vse ok budet!!! Mi bes ta ni kak )))