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