include io.asm ; подключаем ввод-вывод stack segment stack ; СТЭК! dw 128 dup (?) stack ends data segment const equ 100 ; начальный размер массива n db const dup (?); нач. массив con dw 100 ; размер нового массива k db const dup (?); новый массив zag equ 64 ; для опрделения загл букв desat db 10 ; вспомогательная переменная data ends code segment 'code' assume ss:stack, ds:data, cs:code vstavil proc ; si, al - внутренние переменные mov si,0 ; счетчик L3:inch al cmp al,'.' ; проверяем на окончание je L4 mov n[si],al ;заполняем inc si jmp L3 ; цикл L4:mov con,si ; запоминаем размер ret vstavil endp proveril proc ; si внутр. переменная, bx выходные данные mov si,-1 ; счетчик mov bx,0 ; указатель на вариант L6:inc si cmp si,con ; проверка выхода je L7 cmp n[si],95 ; Считаем в bx разницу в кол-ве заглавных и незаглавных ja L5 cmp n[si],zag jb L16 inc bx jmp L6 L5:dec bx L16:jmp L6 L7:ret proveril endp varodin proc ; si, di, ax - внутренние переменные mov si,-1 ;счетчики mov di,-1 L8:mov ax,0 inc si inc di cmp si,con ; условие выхода je L9 cmp n[si],95 ;проверка на загл. букву ja L10 cmp n[si],zag jb L10 mov al,n[si] ; считаем, что именно нужно вставить sub al,zag cbw div desat add ah,48 mov k[di],ah ; вставляем jmp L8 L10:mov al,n[si] ; заносим без изменений в массив mov k[si],al jmp L8 L9:ret varodin endp varvtoroi proc ; bp, si, ax внутр., используется стэк, mov cx,con ; задаем счетчики mov si,0 mov ax,0 mov bp,1 mov al,n[si] ; сохраняем первый символ push ax loo2:inc si mov al,n[si] pop di cmp di,ax ; проверяем символ на повтор je L11 push di ; заносим в стэк нужные символы inc bp ; считаем новый размер массива L11:push ax loop loo2 ; зацикливаем mov si,bp ; заполняем массив L12:pop ax mov k[si],al dec si cmp si,0 jne L12 ret varvtoroi endp vivesti proc ; si,ax,bx,bp внутренние переменные newline mov si,0 ; СЧЕТЧИК cmp si,con je L18 L15:mov al,n[si] ; ВЫВОД СИМВОЛОВ ИЗНАЧ МАССИВА outch al inc si cmp si,con ; условие выхода jne L15 cmp bx,0 ; какой вар. использовался jne L14 mov bp,con ; если первый вар L14:mov si,0 newline ;'0-if first var, other-second: ' outint bx ; вывод варианта newline L13:mov al,k[si] ; вывод второго массива outch al inc si cmp si,bp ; условие выхода jne L13 ret L18:outch '0' ret vivesti endp start: mov ax,data mov ds,ax call vstavil ; ввод newline call proveril cmp bx,0 ; проверка варианта jne L1 call varodin ; первый вар jmp L2 L1:call varvtoroi ; второй вар L2:call vivesti ; вывод newline finish ;ФИНИШ code ends end start