Удаление TAB'ов и SPACE'ов

Тема в разделе "WASM.A&O", создана пользователем bogrus, 8 июл 2005.

  1. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Может кому пригодится - тупой вариант удаления табуляций\пробелов со смещением в строке (возвращает новый размер строки)
    Код (Text):
    1. ;===================================
    2.             mov     ebx,buffer
    3.             call    del9_32
    4. ;===================================
    5. del9_32:    push    ebx
    6.             mov     eax,ebx
    7. @@:         movzx   ecx,byte[eax]
    8.             movzx   edx,byte[eax]
    9.             inc     eax
    10.             mov     byte[ebx],cl
    11.             xor     ecx,0x20
    12.             xor     edx,0x09
    13.             and     ecx,edx
    14.             lea     ebx,[ebx+1]
    15.             jnz     @b
    16.             movzx   ecx,byte[eax-1]
    17.             cmp     ecx,0
    18.             lea     ebx,[ebx-1]
    19.             jnz     @b
    20.             sub     ebx,[esp]
    21.             mov     eax,ebx
    22.             pop     ebx
    23.             ret
    24. ;===================================
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А зачем в середине удалять?
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Я делал таблички в Excel, потом копировал в after_excel.txt, получалась такая херня(и поболее):
    Код (Text):
    1. 0       0       1       1       0       0       0       0
    2. 0       0       1       1       0       0       0       1
    3. 0       0       1       1       0       0       1       0
    4. 0       0       1       1       0       0       1       1
    5. 0       0       1       1       0       1       0       0
    После натравки "del9_32.exe after_excel.txt" имел:
    Код (Text):
    1. 00110000
    2. 00110001
    3. 00110010
    4. 00110011
    5. 00110100
    Под строкой я имел ввиду, что на 0 заканчивается :)
     
  4. cresta

    cresta Active Member

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





    А вот вариант для удаления пробелов и табов в начале и в конце строки. В середине не трогает. Возвращает тоже длину получившейся строки.


    Код (Text):
    1. strtrim proc lpSource:DWORD,lpDest:DWORD
    2.     option  prologue : none
    3.     option  epilogue : none
    4.    
    5.     push    esi
    6.     push    edi
    7.     mov     esi,[esp+12]
    8.     mov     edi,[esp+16]
    9.     dec     esi
    10. align 16
    11.  @@:
    12.     inc     esi
    13.     cmp     byte ptr [esi],32
    14.     je      @B
    15.     cmp     byte ptr [esi],9
    16.     je      @B
    17.     cmp     byte ptr[esi],0
    18.     jne     _a
    19.     xor     eax,eax
    20.     mov     byte ptr[edi],0
    21.     pop     edi
    22.     pop     esi
    23.     retn    8
    24. align 16
    25.  @@:mov     al,[esi]
    26.     inc     esi
    27.     mov     [edi],al
    28.     inc     edi
    29.     test    al,al
    30.     jz      _ret
    31. _a: test    esi,3
    32.     jnz     @B
    33.     sub     esi,4
    34.     sub     edi,4
    35.     jmp     _loop
    36. align 16
    37. _last:
    38.     mov     al,[esi]
    39.     inc     esi
    40.     mov     [edi],al
    41.     inc     edi
    42.     test    al,al
    43.     jnz     _last
    44.     dec     edi
    45. _rspc:
    46.     dec     edi
    47.     cmp     byte ptr[edi],32
    48.     je      _rspc
    49.     cmp     byte ptr[edi],9
    50.     je      _rspc
    51.     inc     edi
    52.     mov     byte ptr[edi],0
    53. _ret:
    54.     mov     eax,edi
    55.     sub     eax,[esp+16]
    56.     pop     edi
    57.     pop     esi
    58.     retn    8
    59. align 16
    60. _loop:
    61.     add     esi,4
    62.     add     edi,4
    63.     mov     eax,[esi]
    64.     mov     ecx,-16843009
    65.     mov     edx,eax
    66.     add     ecx,eax
    67.     not     eax
    68.     and     ecx,eax
    69.     and     ecx,-2139062144
    70.     jnz     _last
    71.     mov     [edi],edx
    72.     jmp     _loop
    73.  
    74.     option prologue : prologuedef
    75.     option epilogue : epiloguedef
    76. strtrim endp






    Вроде чуть длинновато :)

    Но довольно быстро работает.
     
  5. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    вот еще варантик на fasm'е:
    Код (Text):
    1.  
    2. ; 1. Заменяет TAB пробелами.
    3. ; 2. Убирает полностью пробелы в начале и конце строки
    4. ; 3. Группы пробелов заменяет одним.
    5. ; на выходе eax - длина строки без пробелов
    6. proc TrimSpace, String
    7.    begin
    8.         push    esi
    9.         push    edi
    10.         mov     esi,[String]
    11.         cld
    12.         mov     edi,esi
    13.         mov     ah,1
    14.         mov     ecx,esi
    15. .loop:
    16.         lodsb
    17.         test    al,al
    18.         jz      .end
    19.         cmp     al,20h          ; пробел
    20.         je      .space
    21.         cmp     al,09h          ; TAB
    22.         je      .tab
    23.         xor     ah,ah
    24.         lea     edx,[edi+1]     ; для завершающего 0, если окажется что символ последний
    25. .stos:
    26.         stosb
    27.         jmp     .loop
    28. .tab:
    29.         mov     al,20h
    30. .space:
    31.         test    ah,ah
    32.         mov     ah,1
    33.         jz      .stos
    34.        
    35.         jmp     .loop
    36. .end:
    37.         neg     ecx
    38.         mov     edi,edx
    39.         stosb
    40.         lea     eax,[edx+ecx]
    41.         pop     edi
    42.         pop     esi
    43.    return
    44. endp
    45.  
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Вход: esi - строка; выход: ecx = длина без разделителей.


    Код (Text):
    1.     xor ecx, ecx
    2.     mov edi, esi
    3. l1: lodsb
    4.     cmp al, 9
    5.     jz  l1
    6.     cmp al, 20h
    7.     jz  l1
    8.     stosb
    9.     inc ecx
    10.     cmp al, 0
    11.     jnz l1
    12.     dec ecx








    bogrus







    Жжош падонак! ;)
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну перемудрил маленько, начал делать работу ROB'а :) конечно он сам хорошо справляется, надо было оставить
    Код (Text):
    1. dec ebx
    2. cmp byte[eax-1] ,0
     
  8. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    [offtop]

    bogrus

    я такие преобразования в word'е делаю, CTRL+H и вперед :)
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    [offtop]

    Kozyr__

    у меня как-то была только совершенно голая виндос + флэшка с фасмом, пришлось на нём писАть прогу которая то ли меняла символы перевода строки на другие, то ли что то вроде =) это было быстрее, чем читать доку (которой тоже не было) по WSH (который я не знал).
     
  10. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    [offtop]

    S_T_A_S_

    талантливый у тебя подход к делу :)

    (без иронии, я серьезно)