Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическая 2.docx
Скачиваний:
2
Добавлен:
01.02.2023
Размер:
1.82 Mб
Скачать

Обработка результатов.

Код программы:

;Определение сегмента стека

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

Результат работы программы:

Соседние файлы в предмете Системное программное обеспечение