Удаление удвоенных букв в словах - Assembler
Формулировка задачи:
удалить удвоенные буквы в словах
Решение задачи: «Удаление удвоенных букв в словах»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- CrLf db 0Dh, 0Ah, '$'
- String db 'Direct connection of a fuel valve to terminal 20 is only permitted', '$'
- Len dw $-String
- .code
- main proc
- mov ax, @data
- mov ds, ax
- mov ah, 09h
- ;вывод исходной строки
- lea dx, String
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;настройка сегментного регистра es для строковых команд
- mov ax, ds
- mov es, ax
- cld ;направление строковых команд - вперёд
- lea si, String ;адрес строки
- inc si ;просмотр строки со 2-го символа
- mov di, si
- mov cx, Len ;длина строки
- jcxz @@Result
- dec cx
- jcxz @@Result
- mov Len, 1
- @@For:
- lodsb
- cmp al, [si-2]
- je @@Next
- stosb
- inc Len
- @@Next:
- loop @@For
- @@Result:
- mov ah, 09h
- lea dx, String
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- end main
Объяснение кода листинга программы
- Создание переменных:
CrLf
db 0Dh, 0Ah, '$' (переменная для сохранения последовательности символов перевода строки)String
db 'Direct connection of a fuel valve to terminal 20 is only permitted', '$' (переменная для хранения строки)Len
dw $-String (переменная для хранения длины строки)
- Настройка сегментов:
mov ax, @data
(загрузка адреса сегмента данных в регистрax
)mov ds, ax
(передача адреса сегмента данных изax
вds
)
- Вывод исходной строки:
mov ah, 09h
(установка функции вывода строки для прерывания21h
)lea dx, String
(загрузка адреса строки в регистрdx
)int 21h
(вызов прерывания для вывода строки)
- Редактирование строки:
cld
(установка направления строковых команд вперед)lea si, String
(загрузка адреса строки в регистрsi
)inc si
(переход ко 2-му символу строки)mov di, si
(копированиеsi
вdi
)mov cx, Len
(загрузка длины строки в регистрcx
)jcxz @@Result
(пропуск обработки, если длина строки равна нулю)dec cx
(уменьшениеcx
на 1)jcxz @@Result
(пропуск обработки, если длина строки равна 1)mov Len, 1
(установка длины строки в 1)
- Цикл просмотра строки:
lodsb
(загрузка байта данных изds:si
вal
и увеличениеsi
на 1)cmp al, [si-2]
(сравнение текущего символа с предыдущим)je @@Next
(переход к метке@@Next
, если символы одинаковые)stosb
(сохранениеal
вes:di
и увеличениеdi
на 1)inc Len
(увеличение длины на 1)
- Повторение цикла, если длина строки не равна 0:
loop @@For
(уменьшениеcx
на 1 и переход к метке@@For
, еслиcx
не равен 0)
- Вывод результирующей строки:
mov ah, 09h
(установка функции вывода строки для прерывания21h
)lea dx, String
(загрузка адреса строки в регистрdx
)int 21h
(вызов прерывания для вывода строки)
- Завершение программы:
mov ax, 4C00h
(загрузка значения для завершения программы)int 21h
(вызов прерывания для завершения программы)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д