.DATA Buff db "10000",0 .CODE start:start: xor ebx,ebx ;Потготавливаем параметры для MessageBox push ebx ;Заодно инициализируем переменные lea edi, Buff ;Биты 3-0 ebx будут флагами, push ebx ;но в обратном порядке push edi ;если хоть один бит != 0 => ebx!=0 push ebx mov ecx,5 ;ecx кол-во сканируемых байт+1 mov al,'1' cld _loop: repne scasb ;Последний символ в строке - 0 jecxz _next ;На нем сразу выходим bts ebx,ecx ;Иначе ставим 1 в соотв. бите ebx jmp _loop ;и крутимся пока ecx!=0 _next: or ebx,ebx jz _nomessage call MessageBox ;Если ebx не 0, то показываем сообщение ret ;и выходим _nomessage: add esp,16 ;Иначе выравнивем стек ret ;и выходим
Не удержался, уж больно с ММХ все красиво получается Code (Text): .data Flag dd 0 Flag1 dd 8 dup (0) align 16 mask01 dq 0101010101010101h align 16 szText db "10011110" .code start: lea eax, szText movq mm4, mask01 movq mm0, [eax] pand mm0, mm4 psadbw mm1, mm0 ; !!! не ниже П3 movd Flag, mm1 pxor mm1, mm1 punpcklbw mm1, mm0 punpckhbw mm2, mm0 movq mm0, mm2 pxor mm2, mm2 pxor mm4, mm4 punpcklwd mm2, mm0 punpckhwd mm4, mm0 movq mm0, mm4 pxor mm4, mm4 punpcklwd mm3, mm1 punpckhwd mm4, mm1 movq mm1, mm4 psrld mm0, 18h psrld mm1, 18h psrld mm2, 18h psrld mm3, 18h lea eax, Flag1 movq [eax+0*8], mm3 movq [eax+1*8], mm1 movq [eax+2*8], mm2 movq [eax+3*8], mm0