Обработка результатов.
Код программы:
;Определение сегмента стека
STAK SEGMENT STACK
DB 256 DUP (?)
STAK ENDS
;Определение сегмента данных
DATA SEGMENT
msg1 db 'Enter string: $' ;выводимая на экран строка
msg2 db 13,10,'Result: $' ;выводимая на экран строка
buf db 80,81 dup(0) ;принимает строку, введенную с клавиатуры
DATA ENDS
;Определение сегмента кода
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAK
;Определение подпрограммы
START:
MOV BX, data ;и обязательная инициализация
MOV DS,BX ;регистра DS в начале программы
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текст в buf
mov si,offset buf[2] ;адрес начала строки для источника
mov di,si ;адрес начала строки для приемника
lp: mov al,[si] ;взять очередной символ из строки
cmp al,13 ;если это конец строки
jz fin ;то переход
cmp al,'a' ;если не "а"
jnz nota ;то продолжить
mov al,'A' ;заменить "а" на "А"
jmp sav ;сохранить символ
nota: cmp al,' ' ;если пробел,
jz skip ;то пропустить сохранение
sav: mov [di],al ;сохранить символ
inc di ;увеличить адрес приемника
skip: inc si ;адрес следующего символа
jmp lp ;продлжить работу
fin: mov ah,9 ;функция вывода сообщения на экран
lea dx,msg2 ;выводимое сообщение
int 21h ;выводим на экран
mov byte ptr [di],0 ;в конец строки после удаления пробелов и замены символа записать признак конца строки
mov cx,di ;адрес конца строки
sub cx,offset buf[2] ;вычесть адрес начала строки, получили длину новой строки
jcxz fin1 ;если она равна 0, перейти
mov ah,2 ;функция вывода символа на экран
mov si,offset buf[2] ;адрес начала строки
lp2: mov dl,[si] ;взять очередной символ из строки
int 21h ;вывести на экран
inc si ;перейти к следующему
loop lp2 ;пройти в цикле по всем символам строки
fin1: MOV AH,4CH ;Операторы завершения программы
INT 21H
CODE ENDS
END START
Результат работы программы:
Зачётное задание.
Добавьте в алгоритм обработки строки, введенной с клавиатуры, замену последовательности символов "abc" на "cba".
Код программы:
;Определение сегмента стека
STAK SEGMENT STACK
DB 256 DUP (?)
STAK ENDS
;Определение сегмента данных
DATA SEGMENT
msg1 db 'Enter string: $' ;выводимая на экран строка
msg2 db 13,10,'Result: $' ;выводимая на экран строка
buf db 80,81 dup(0) ;принимает строку, введенную с клавиатуры
DATA ENDS
;Определение сегмента кода
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAK
;Определение подпрограммы
START:
MOV BX, data ;и обязательная инициализация
MOV DS,BX ;регистра DS в начале программы
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текст в buf
mov si,offset buf[2] ;адрес начала строки для источника
mov di,si ;адрес начала строки для приемника
mov cx,0 ;счётчик
lp:
cmp cx,3 ;если cx равен 3
jz changeabc ;то перейти в замену послед-ти
mov al,[si] ;взять очередной символ из строки
cmp al,13 ;если это конец строки
jz fin ;то переход
cmp al,'a' ;если не "а"
jnz nota ;то продолжить
cmp cx,4 ;если счётчик не равен 4
jnz checkbc ;то переходить в проверку bc
mov al,'A' ;заменить "а" на "А"
jmp sav ;сохранить символ
checkabc:
mov cl, [si+1] ;сохраняем след символ в cl
cmp cl,'b' ;проверяем равен ли b
mov cx,4 ;присваиваем cx 4
jnz lp ;если cl не равен b, уходим в цикл
mov dl, [si+2] ;сохраняем символ через 2 в dl
cmp dl,'c' ;проверяем равен ли c
jnz skip ;если нет, то пропускаем
mov cx,3 ;присваиваем счётчику 3
jmp lp ;и переходим в lp
changeabc:
mov al,'c' ;сохраняем в регистр al символ c
mov cl,'b' ;сохраняем в регистр cl символ b
mov dl,'A'. ;сохраняем в регистр dl символ A
mov [di],al ;в текущий индекс символ с
mov [di+1],cl ;в индекс +1 – символ b
mov [di+2],dl ;в индекс +2 – символ A
add si,3 ;значение источника +3
add di,3 ;значение преемника +3
mov cx,0 ;обнуление счётчика
jmp lp ;переход в lp
nota:
cmp al,' ' ;если пробел,
jz skip ;то пропустить сохранение
sav:
mov [di],al ;сохранить символ
inc di ;увеличить адрес приемника
skip:
mov cx,0 ;обнулить счётчик
inc si ;адрес следующего символа
jmp lp ;продлжить работу
fin:
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg2 ;выводимое сообщение
int 21h ;выводим на экран
mov byte ptr [di],0 ;в конец строки после удаления пробелов и замены символа записать признак конца строки
mov cx,di ;адрес конца строки
sub cx,offset buf[2] ;вычесть адрес начала строки, получили длину новой строки
jcxz fin1 ;если она равна 0, перейти
mov ah,2 ;функция вывода символа на экран
mov si,offset buf[2] ;адрес начала строки
lp2:
mov dl,[si] ;взять очередной символ из строки
int 21h ;вывести на экран
inc si ;перейти к следующему
loop lp2 ;пройти в цикле по всем символам строки
fin1:
MOV AH,4CH ;Операторы завершения программы
INT 21H
CODE ENDS
END START
Результат работы программы: