.486 data1 segment use16 str1 db '123o+sdvjsvp-lkn oj09 09uknURd09 9u0jRen 90jpji2lnacjwfikjnbg',13,10,'$' str2 db ' ',13,10,'$' str3 db ' ',13,10,'$' bitstr db '1010010110100101101001011010010110100101101001011010010110100101',13,10,'$' bits dq 1010010110100101101001011010010110100101101001011010010110100101b data1 ends stack segment stack use16 db 100h dup(?) stack ends code segment use16 'code' assume ds:data1,cs:code start: mov ax,data1 mov ds,ax push ds pop es ; настраиваем es в соответствии с нашим сегментом данных mov si, offset str1 mov di, offset str2 cld ;направлене обработки прямое mov cx,64 mov ebp,dword ptr bits ;загрузка маски mov edx,dword ptr bits+4 ;в два 32-х разр. регистра next1: lodsb ;считали символ из входной строки test ebp,80000000h ;если вит маски установлен jz e1 ;обработка не нужна cmp al,'0' ;начинаем обработку jl s1 cmp al,'9' jle e1 s1: stosb ;если символ не цифра помещаем его в строку рез. e1: shld ebp,edx,1 ;сдвиг старших разрядов со сдвигом в него старшего ;разряда младших 32-ух разрядов маски shl edx,1 ;сдвиг младших разрядов, т.к. предыдущая команда ;сдвигает только ebp loop next1 ;продолжаем обработку ; Part 2 std ;направление обработки обратное (от конца строк) mov si,offset str1+63 mov di,offset str3+63 mov cx,64 n100: lodsb ;считали текущий символ cmp al,' ' ;если это пробел - переход к следующей итерации jz e2 cmp al,'R' ;если считали R je findU ;пытаемся найти U stosb ;все остальные символы записываются в строку результата 2 jmp e2 findU: mov ah,ds:[si] ;в si сейчас позиция байта перед R cmp ah,'U' ; если это U, то выход jz exitp2 stosb ;вывод R без следующего U e2: loop n100 exitp2: ;вывод исходной строки и строк результатов на экран mov dx,offset str1 mov ah,9 int 21h mov dx,offset bitstr ; mov ah,9 int 21h mov dx,offset str2 ; mov ah,9 int 21h cld mov di, offset str3 mov cx,64 mov al,' ' repe scasb sub di, offset str3 lea dx,str3[di] ; mov ah,9 int 21h ;завершение работы программы mov ax,4C00h int 21h code ends end start