.386 ; include strings.inc extrn IsInRange:far ;Проверяет, является ли байт al заключенным ;в диапазон dl<=al<=dh ;Вход: al - проверяемый символ ; dl - меньшая (нижняя) граница диапазона ; dh - большая (верхняя) граница диапазона ;Выход: ah - 00h - символ не является строчной буквой ; FFh - является extrn ASCIIZprint:far ;Выводит на консоль ASCIIZ-строку ;Вход: ds:si - начало ASCIIZ-строки ;Выход: ds:si - следующий байт после 0-байта extrn StrChr:far ;Поиск символа в строке ;Вход: es:di - начало строки ; al - символ ; df - направление сканирования ;Выход: es:di - найденный символ или 0, если символ ;не найден stk SEGMENT STACK 'STACK' USE16 DB 400h DUP(?) stk ENDS STRSIZE equ 64 dat SEGMENT PARA 'DATA' USE16 in_str DB 'AAacdefGhURijkl,mnqtuvwxYz738499227568763jhkljewhX jke3whkjgherkj',0 bitstr DD 000000000000000000000000010000001b, 0FFFFFFFFh outstr1 DB (STRSIZE+1) DUP(0) outstr2 DB (STRSIZE+1) DUP(0) sInStrP DB 'Исходная строка:',0 sBitStrP DB 'Битовая строка: ',0 sOutStr1P DB 'Выходная строка №1: ',0 sOutStr2P DB 'Выходная строка №2: ',0 sCRLF DB 10,13,0 dat ENDS text SEGMENT 'CODE' USE16 ASSUME cs:text,ds:dat,es:dat,ss:stk start: mov ax,dat mov ds,ax mov es,ax jmp main IsDigit PROC NEAR ;Проверяет, является ли байт al десятичной цифрой ;Вход: al - символ ;Выход: ah - 00h - символ не является десятичной цифрой ; FFh - является push dx mov dl,'0' mov dh,'9' call IsInRange pop dx ret IsDigit ENDP IsSmall PROC NEAR ;Проверяет, является ли байт al строчной буквой латинского ;алфавита ;Вход: al - символ ;Выход: ah - 00h - символ не является строчной буквой ; FFh - является push dx mov dl,'a' mov dh,'z' call IsInRange pop dx ret IsSmall ENDP IsBig PROC NEAR ;Проверяет, является ли байт al строчной буквой латинского ;алфавита ;Вход: al - символ ;Выход: ah - 00h - символ не является строчной буквой ; FFh - является push dx mov dl,'A' mov dh,'Z' call IsInRange pop dx ret IsBig ENDP BitPrint PROC NEAR ;Выводит на стандартный вывод битовую строку, с ;замененными символами '0' и '1' значениями бит ;Вход: si - указатель на начало битовой строки ; cx - длина строки push bx push ax push dx xor bx,bx mov ah,2 ;DOS Display char function BitPrint_loop: bt [si],bx jc BitPrint_1 mov dl,'0' jmp short BitPrint_print BitPrint_1: mov dl,'1' BitPrint_print: int 21h inc bx loop BitPrint_loop pop dx pop ax pop bx ret BitPrint ENDP main: mov si,offset sInStrP call ASCIIZprint mov si,offset in_str call ASCIIZprint mov si,offset sCRLF call ASCIIZprint ;Формирование первой строки xor esi,esi xor ebx,ebx mov di,offset outstr1 mov cx,64 cld str1_loop1: mov al,in_str[si] call IsBig ;Вход: al - символ ;Выход: ah = 00h - не является test ah,0FFh jz str1_skip1 bt bitstr,esi jnc str1_skip1 stosb ; bts bitstr,esi ;Установка нужного бита в битовой строке inc ebx str1_skip1: inc ebx inc si loop str1_loop1 mov si,offset sBitStrP call ASCIIZprint mov si,offset bitstr mov cx,64 call BitPrint ; mov si,offset sCRLF ; call ASCIIZprint mov si,offset sOutStr1P call ASCIIZprint mov si,offset outstr1 call ASCIIZprint mov si,offset sCRLF call ASCIIZprint ;Формирование второй строки cld mov di,offset outstr2 ;di указывает на последний ;байт строки mov si,64 mov cx,64 str2_loop1: mov al,in_str[si] cmp al,'R' jne str2_store push ax mov al,in_str[si-1] cmp al,'U' pop ax jnz str2_store ;Нет jmp str2_e ;Да - заканчиваем формирование str2_store: stosb dec si loop str2_loop1 str2_e: inc di ;В конце цикла di указывает на байт, предшествующий ;первому байту второй результилующей строки :) mov si,offset sOutStr2P call ASCIIZprint mov si,offset outstr2 call ASCIIZprint mov si,offset sCRLF call ASCIIZprint mov ax,4C00h int 21h text ENDS END start