Удаление удвоенных букв в словах - 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
(вызов прерывания для завершения программы)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д