либа для строк

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 21 июн 2005.

  1. cresta

    cresta Active Member

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

    если объединять например strcmp и strcmpi в одну, то ни та ни другая не будут оптимальными. Чем универсальнее, тем медленнее получится. И вызовы более громоздкие. За примером далеко ходить не надо: fpulib от Filiatreault из пакета масм: пока разберешься с передаваемыми параметрами, быстрее свой код написать :), который к тому же и быстрее в разы окажется. К тому же универсальность может наложить ограничения на функциональность.

    А делать по принципу оболочки, вызывающей соответствующие различные ф-ции, имхо смысла нет. Только писать больше.
     
  2. cresta

    cresta Active Member

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

    strtok - это тот же instr, если его вызывать с параметром стартовой позиции, полученным от предыдущего вызова.
     
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    cresta

    Да у меня они на самом деле разные, просто вызов один.

    Так и запоминать короче, и код более гибкий (в твоем случае придется переходами вызывать разные процедуры, в моем изменить ключ в регистре). IMHO, потратить несколько тактов на разводку, но не парится самому гораздо лучше.

    >fpulib от Filiatreault

    ну это вобще чудная какая-то библиотека, мне опять же важна была скорость написания программы, я сделал FPU_work (наверно те, кто не любит макросы и дзенствует на fpu кодом аж икают когда его видят :)



    >inst и split

    у меня есть следующая процедура
    Код (Text):
    1.  
    2. zameni_v_str
    3.  lpsz_text:DWORD
    4.  lpsz_cto:DWORD
    5.  lpsz_nacto:DWORD
    6.         Заменяет в строке (lpsz_text) все участки (lpsz_cto) на (lpsz_nacto).
    7.         Если (lpsz_nacto)=0 то удаляет найденные участки.
    8.  
    9.         Пример:
    10.         ...
    11.         tx_1 db "%SystemRoot%\system32;", 0
    12.         db 256 dup(?)
    13.         ...
    14.         invoke zameni_v_str, OF tx_1, tx("%SystemRoot%"), tx("C:\WINXP")
    15.         ...
    16.         изменит строку tx_1 на 'C:\WINXP\system32;'
    17.  


    По-моему, удобно.
     
  4. cresta

    cresta Active Member

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

    Оболочку для развода по разным функциям/участкам функции можно добавить всегда :) Главное набрать побольше функциональности, т.е. какие функции могут понадобиться.







    strncpy - это strleft/strmid (по вкусу)

    strncmp и strncmpi - эту функциональность си-функций обеспечивают strcmp и strcmpi соответственно, т.к. они возвращают количество совпавших символов, достаточно сравнить eax с той длиной, которую надо проверить на совпадение.



    Чуть подробней функционал каждой функции расписан в аттаче.

    [​IMG] 1559100728__strlib.inc
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    >multicat

    Стек не обязательно чистить вручную,MASM:
    Код (Text):
    1.  
    2. sloji_str_mnogo  proto C :DWORD,:DWORD,:VARARG
    3. ...
    4. sloji_str_mnogo proc C n:DWORD,kuda:DWORD,x:VARARG
    5. ...
    6. sloji_str_mnogo endp
    7.  


    сам делает правильный invoke:

    invoke sloji_str_mnogo, 3, ADDR tx_1, tx("a"), tx("b"), tx("c")

    А для того, чтоб число самому не считать, у меня макрос
    Код (Text):
    1.  
    2. ;-
    3. m_str_add macro kuda, x:VARARG
    4. Local n
    5. n=0
    6. % FOR arg, <x>
    7.  n=n+1
    8.  ENDM
    9.  
    10.  IF n EQ 1
    11.   invoke sloji_str, kuda, x
    12.  ELSE
    13.   invoke sloji_str_mnogo,n, kuda, x
    14.  ENDIF
    15.  
    16. endm
    17.  
     
  6. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    да, а исходник будет? :)
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    invoke сделает очистку, просто есть ещё и call, поэтому такая оговорка.





    не знаю, сгодится этот исходник кому-либо? Делаю под свою конкретную задачу (максимум скорости при полном пренебрежении размером), поэтому некоторые фрагменты могут показаться странными :) Но если кому-то интересно, почему бы и нет.
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    ну давай сравним исходниками :)

    вот моя процедура для сравнения строк
     
  9. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
  10. cresta

    cresta Active Member

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

    Зачем функциональность процедуры описывать флагами? Их потом нужно будет разгребать условными переходами, или тебе скорость и размер совсем не важны?



    Вот процедура, которая не требует ни одного флага, обеспечивает больше функциональности (информации на выходе о сравниваемых строках), работает в три раза быстрее (98 против 292 тиков), меньше и просто наглядней :)



    Это регистрозависимое сравнение. Для регистронезависимого думаю разница будет ещё больше, я не смог помотреть этот случай, т.к. там вызывается некая inva_win CharLower, а этой процедуры нет, пришлось регистронезависимую часть закомментировать.



    P.S.

    Проверял на таких строках:

    str_1 db 'aaabbbcaccdddaeeeffafggaghhahiiiajjjkkaklalaalac',0

    str_2 db 'aaabbbcaccdddaeeeffafggaghhahiiiajjjkkaklalaalaa',0



    [​IMG] 1338633707___cr_strcmp.txt
     
  11. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    хы, век живи век учись- а я думал StrLen из masm32lib работает только с символами от 0 до 127, а она и с русскими действует :) Надо переделать свои на
    Код (Text):
    1.  
    2.     mov     ebx,[eax]              ; read first 4 bytes
    3.     add     eax,4                  ; increment pointer
    4.     lea     ecx,[ebx-01010101h]    ; subtract 1 from each byte
    5.     not     ebx                    ; invert all bytes
    6.     and     ecx,ebx                ; and these two
    7.     and     ecx,80808080h    
    8.  
    9. вместо
    10.   mov ecx, 0000000FFh
    11.   test eax, ecx
    12.   jz @@s22
    13.   test ebx, ecx
    14.   jz @@s22
    15.   mov ecx, 00000FF00h
    16.   test eax, ecx
    17.   jz @@s23
    18.   test ebx, ecx
    19.   jz @@s23
    20.   mov ecx, 000FF0000h
    21. ...
    22.  


    CharLower - это Виндовая, просто макрос inva_win регистры не портит (кроме eax). Самому разбираться с таблицей по моему опасно, мало ли чего.



    Только в твоей не ясно, когда сравниваешь например "proba" и "probe", выдает-то 4
     
  12. cresta

    cresta Active Member

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




    Ничего не перепутал ? В смысле какая строка первая, какая вторая :)

    Выдаёт (-4) для



    str_1 db "proba",0

    str_2 db "probe",0



    push offset str_2

    push offset str_1

    call cr_strcmp



    т.е. str_1 меньше, и совпадают первые 4 символа. Как и должно быть.
     
  13. cresta

    cresta Active Member

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



    Кстати, о птицах: конец unicode-строки это нулевой ворд по любому смещению от начала или по смещению, кратному 2-м? Что-то по этому вопросу ничего не найду :dntknw:


    Код (Text):
    1. db    44,04,4B,04,00,00      'фы'
    2. db    44,04,4B,00,00         'фK'




    Вторая строка правильная или нет?
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вторая строка неправильна: размер символа = 2 байта (соответственно, все символы расположены по смещению кратному 2м), а тут получается пол-символа.
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Однако юникод довольно корявая весчь :dntknw:

    S_T_A_S_

    Когда ты говорил о конвертации, о чем шла речь? Виндовые апи типа MultiByteToWideChar или другие способы?
     
  16. _hidden_

    _hidden_ New Member

    Публикаций:
    0
    Регистрация:
    10 май 2005
    Сообщения:
    30
    Адрес:
    Russia
    а я еще хочу loop чтобы не до нуля а до определенного значения
     
  17. cresta

    cresta Active Member

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

    Программка в аттаче. Должен выводиться юникод-MessageBox с пятью строками:
    Код (Text):
    1. 0123456789!@#$%^&*()_+={}~?><":;][
    2. abcdefghijklmnopqrstuvwxyz
    3. ABCDEFGHIJKLMNOPQRSTUVWXYZ
    4. абвгдеёжзийклмнопрстуфхцчшщьыъэюя
    5. АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ




    На ХР (без SP) вроде работает, на других не знаю, не на чем проверить :dntknw:





    [​IMG] 2012546859__GENERIC.exe
     
  18. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    XP sp1 - работает.
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Велосипед изобретаешь?

    MultiByteToWideChar и WideCharToMultiByte прекрасно справляются и с определением размера буфера под результирующую строку и с конвертированием.
     
  20. cresta

    cresta Active Member

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



    Да, велосипед :)

    В начале темы оговорил, что делаю быстрый велосипед, гоночный :)