Удаление удвоенных букв в словах - 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
Объяснение кода листинга программы
- Создание переменных:
CrLfdb 0Dh, 0Ah, '$' (переменная для сохранения последовательности символов перевода строки)Stringdb 'Direct connection of a fuel valve to terminal 20 is only permitted', '$' (переменная для хранения строки)Lendw $-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(вызов прерывания для завершения программы)