Удаление удвоенных букв в словах - 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

Объяснение кода листинга программы

  1. Создание переменных:
    • CrLf db 0Dh, 0Ah, '$' (переменная для сохранения последовательности символов перевода строки)
    • String db 'Direct connection of a fuel valve to terminal 20 is only permitted', '$' (переменная для хранения строки)
    • Len dw $-String (переменная для хранения длины строки)
  2. Настройка сегментов:
    • mov ax, @data (загрузка адреса сегмента данных в регистр ax)
    • mov ds, ax (передача адреса сегмента данных из ax в ds)
  3. Вывод исходной строки:
    • mov ah, 09h (установка функции вывода строки для прерывания 21h)
    • lea dx, String (загрузка адреса строки в регистр dx)
    • int 21h (вызов прерывания для вывода строки)
  4. Редактирование строки:
    • 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)
  5. Цикл просмотра строки:
    • lodsb (загрузка байта данных из ds:si в al и увеличение si на 1)
    • cmp al, [si-2] (сравнение текущего символа с предыдущим)
    • je @@Next (переход к метке @@Next, если символы одинаковые)
    • stosb (сохранение al в es:di и увеличение di на 1)
    • inc Len (увеличение длины на 1)
  6. Повторение цикла, если длина строки не равна 0:
    • loop @@For (уменьшение cx на 1 и переход к метке @@For, если cx не равен 0)
  7. Вывод результирующей строки:
    • mov ah, 09h (установка функции вывода строки для прерывания 21h)
    • lea dx, String (загрузка адреса строки в регистр dx)
    • int 21h (вызов прерывания для вывода строки)
  8. Завершение программы:
    • mov ax, 4C00h (загрузка значения для завершения программы)
    • int 21h (вызов прерывания для завершения программы)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы