Удалить заданное слово в строке - Assembler
Формулировка задачи:
Здравствуйте. Помогите с заданием: удалить заданное слово в строке.
Решение задачи: «Удалить заданное слово в строке»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- kbdBuffer db 80, ?, 80 dup(0) ;буфер клавиатуры для ввода строки
- CrLf db 0Dh, 0Ah, '$' ;символы перевода строки
- Delimiter db ' ' ;разделитель слов в строке
- String db ?, 80 dup(0) ;строка в формате длина, символы
- WordForDelete db ?, 80 dup(0) ;строка в формате длина, символы
- PromptStr db 'Enter string:', 0Dh, 0Ah, '$'
- PromptWord db 'Enter word:', 0Dh, 0Ah, '$'
- msgNewString db 'Result String: ', 0Dh, 0Ah, '$'
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;ввод строки
- mov ah, 09h
- lea dx, PromptStr
- int 21h
- lea dx, String
- call GetStr
- ;ввод слова для удаления из строки
- mov ah, 09h
- lea dx, PromptWord
- int 21h
- lea dx, WordForDelete
- call GetStr
- ;цикл выделения слов и сравнения их с удаляемым словом
- mov cx, 0 ;cx - длина строки
- mov cl, String
- jcxz @@Break ;если строка пустая - завершить программу
- mov dx, 0 ;dx - длина удаляемого слова
- mov dl, WordForDelete
- or dx, dx
- jz @@Break
- lea si, String+1 ;si - адрес первого символа строки
- mov di, si ;di - адрес начала слова в строке
- @@For:
- lodsb ;чтение очередного символа в al, увеличение si на 1
- cmp al, Delimiter ;очередной символ - разделитель слов?
- je @@NewWord ;да - перейти к строкам, выполняющим сравнение с образцом
- loop @@For ;
- ;здесь обработка последнего слова в строке
- inc si ;для проверки последнего слова
- @@NewWord:
- pushf
- cld
- ;сравнить длины слов
- mov ax, si
- sub ax, di
- dec ax
- cmp ax, dx
- jne @@Next
- ;при равенстве - сравнить слова
- push si
- push di
- push cx
- push es
- push ds
- pop es
- mov cx, dx
- lea si, WordForDelete+1
- repe cmpsb
- pop es
- pop cx
- pop di
- pop si
- jne @@Next
- ;при совпадении слов - удалить из строки слово
- jcxz @@SkipCopy
- push cx
- push si
- push di
- push es
- push ds
- pop es
- rep movsb
- pop es
- pop di
- pop si
- pop cx
- ;после переноса, просмотр продолжать с 1-го символа удалённого слова
- mov si, di
- dec [String] ;удаляется не только слово, но и разделитель
- @@SkipCopy:
- ;коррекция длины строки
- sub [String], dl
- @@Next:
- popf
- mov di, si
- jcxz @@Break
- loop @@For
- @@Break:
- ;вывод результатов
- mov ah, 09h
- lea dx, msgNewString
- int 21h
- call ShowString
- mov ah, 09h
- lea dx, CrLf
- int 21h
- @@Exit:
- mov ax, 4C00h ;завершение программы
- int 21h
- main endp
- ;Чтение строки с клавиатуры
- ;на входе:
- ; ds:dx - адрес строки
- ;на выходе:
- ; ds:dx - строка в Pascal формате (длина, символы)
- GetStr proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- pushf
- push es
- mov bx, dx ;сохранение адреса строки
- ;чтение в буфер из клавиатуры
- mov ah, 0Ah
- lea dx, kbdBuffer
- int 21h
- ;перевод строки
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;копирование из буфера в переменную строки
- mov cx, 0
- mov cl, [kbdBuffer+1]
- ;jcxz @@SkipCopy
- inc cx
- push ds
- pop es
- lea si, kbdBuffer+1
- mov di, bx
- cld
- rep movsb
- ;добавление признака конца строки за последним символом
- mov byte ptr [di], '$'
- @@SkipCopy:
- pop es
- popf
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- GetStr endp
- ShowString proc
- .386
- pusha
- mov cx, 0
- mov cl, String
- lea si, String
- add si, cx
- mov byte ptr [si+1],'$'
- mov ah, 09h
- lea dx, String+1
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- popa
- ret
- ShowString endp
- end main
Объяснение кода листинга программы
В данном коде реализована функция удаления заданного слова из строки, вводимой пользователем. Список переменных и их значений:
- kbdBuffer - буфер клавиатуры для ввода строки (в формате 80, ?, 80 dup(0)).
- CrLf - символы перевода строки (0Dh, 0Ah, '$').
- Delimiter - разделитель слов в строке (' ').
- String - строка в формате длина, символы.
- WordForDelete - строка в формате длина, символы.
- PromptStr - строка для вывода сообщения
Enter string:
. - PromptWord - строка для вывода сообщения
Enter word:
. - msgNewString - строка для вывода сообщения
Result String:
. - ax, bx, cx, dx, si, di, es, ds, pe, pf, bp, sp, stack_top - регистры и переменные для работы со строками и обработки ввода-вывода. Описание действий:
- Ввод строки с клавиатуры с помощью функции GetStr.
- Ввод слова для удаления из строки с помощью функции GetStr.
- Цикл выделения слов и сравнения их с удаляемым словом.
- Если строка пустая, завершение программы.
- Выделение длины и символов удаляемого слова.
- Сравнение длин слов, если они равны, переход к сравнению слов.
- Если слова совпадают, удаление слова из строки.
- Вывод результатов с помощью функции ShowString.
- Ввод символов перевода строки.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д