Может кому пригодится - тупой вариант удаления табуляций\пробелов со смещением в строке (возвращает новый размер строки) Код (Text): ;=================================== mov ebx,buffer call del9_32 ;=================================== del9_32: push ebx mov eax,ebx @@: movzx ecx,byte[eax] movzx edx,byte[eax] inc eax mov byte[ebx],cl xor ecx,0x20 xor edx,0x09 and ecx,edx lea ebx,[ebx+1] jnz @b movzx ecx,byte[eax-1] cmp ecx,0 lea ebx,[ebx-1] jnz @b sub ebx,[esp] mov eax,ebx pop ebx ret ;===================================
Я делал таблички в Excel, потом копировал в after_excel.txt, получалась такая херня(и поболее): Код (Text): 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 После натравки "del9_32.exe after_excel.txt" имел: Код (Text): 00110000 00110001 00110010 00110011 00110100 Под строкой я имел ввиду, что на 0 заканчивается
Специфичная задача По такой строке как из пушки по воробьям. А вот вариант для удаления пробелов и табов в начале и в конце строки. В середине не трогает. Возвращает тоже длину получившейся строки. Код (Text): strtrim proc lpSource:DWORD,lpDest:DWORD option prologue : none option epilogue : none push esi push edi mov esi,[esp+12] mov edi,[esp+16] dec esi align 16 @@: inc esi cmp byte ptr [esi],32 je @B cmp byte ptr [esi],9 je @B cmp byte ptr[esi],0 jne _a xor eax,eax mov byte ptr[edi],0 pop edi pop esi retn 8 align 16 @@:mov al,[esi] inc esi mov [edi],al inc edi test al,al jz _ret _a: test esi,3 jnz @B sub esi,4 sub edi,4 jmp _loop align 16 _last: mov al,[esi] inc esi mov [edi],al inc edi test al,al jnz _last dec edi _rspc: dec edi cmp byte ptr[edi],32 je _rspc cmp byte ptr[edi],9 je _rspc inc edi mov byte ptr[edi],0 _ret: mov eax,edi sub eax,[esp+16] pop edi pop esi retn 8 align 16 _loop: add esi,4 add edi,4 mov eax,[esi] mov ecx,-16843009 mov edx,eax add ecx,eax not eax and ecx,eax and ecx,-2139062144 jnz _last mov [edi],edx jmp _loop option prologue : prologuedef option epilogue : epiloguedef strtrim endp Вроде чуть длинновато Но довольно быстро работает.
вот еще варантик на fasm'е: Код (Text): ; 1. Заменяет TAB пробелами. ; 2. Убирает полностью пробелы в начале и конце строки ; 3. Группы пробелов заменяет одним. ; на выходе eax - длина строки без пробелов proc TrimSpace, String begin push esi push edi mov esi,[String] cld mov edi,esi mov ah,1 mov ecx,esi .loop: lodsb test al,al jz .end cmp al,20h ; пробел je .space cmp al,09h ; TAB je .tab xor ah,ah lea edx,[edi+1] ; для завершающего 0, если окажется что символ последний .stos: stosb jmp .loop .tab: mov al,20h .space: test ah,ah mov ah,1 jz .stos jmp .loop .end: neg ecx mov edi,edx stosb lea eax,[edx+ecx] pop edi pop esi return endp
Вход: esi - строка; выход: ecx = длина без разделителей. Код (Text): xor ecx, ecx mov edi, esi l1: lodsb cmp al, 9 jz l1 cmp al, 20h jz l1 stosb inc ecx cmp al, 0 jnz l1 dec ecx bogrus Жжош падонак!
Ну перемудрил маленько, начал делать работу ROB'а конечно он сам хорошо справляется, надо было оставить Код (Text): dec ebx cmp byte[eax-1] ,0
[offtop] Kozyr__ у меня как-то была только совершенно голая виндос + флэшка с фасмом, пришлось на нём писАть прогу которая то ли меняла символы перевода строки на другие, то ли что то вроде =) это было быстрее, чем читать доку (которой тоже не было) по WSH (который я не знал).