Удалить заданное слово в строке - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Помогите с заданием: удалить заданное слово в строке.

Решение задачи: «Удалить заданное слово в строке»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         kbdBuffer       db      80, ?, 80 dup(0)        ;буфер клавиатуры для ввода строки
  9.         CrLf            db      0Dh, 0Ah, '$'           ;символы перевода строки
  10.  
  11.         Delimiter       db      ' '                     ;разделитель слов в строке
  12.         String          db      ?, 80 dup(0)            ;строка в формате длина, символы
  13.         WordForDelete   db      ?, 80 dup(0)            ;строка в формате длина, символы
  14.  
  15.         PromptStr       db      'Enter string:', 0Dh, 0Ah, '$'
  16.         PromptWord      db      'Enter word:', 0Dh, 0Ah, '$'
  17.         msgNewString    db      'Result String: ', 0Dh, 0Ah, '$'
  18. .code
  19.  
  20. main    proc
  21.         mov     ax,     @data
  22.         mov     ds,     ax
  23.  
  24.         ;ввод строки
  25.         mov     ah,     09h
  26.         lea     dx,     PromptStr
  27.         int     21h
  28.         lea     dx,     String
  29.         call    GetStr
  30.         ;ввод слова для удаления из строки
  31.         mov     ah,     09h
  32.         lea     dx,     PromptWord
  33.         int     21h
  34.         lea     dx,     WordForDelete
  35.         call    GetStr
  36.  
  37.         ;цикл выделения слов и сравнения их с удаляемым словом
  38.  
  39.         mov     cx,     0       ;cx - длина строки
  40.         mov     cl,     String
  41.         jcxz    @@Break         ;если строка пустая - завершить программу
  42.         mov     dx,     0       ;dx - длина удаляемого слова
  43.         mov     dl,     WordForDelete
  44.         or      dx,     dx
  45.         jz      @@Break
  46.         lea     si,     String+1 ;si - адрес первого символа строки
  47.         mov     di,     si      ;di - адрес начала слова в строке
  48. @@For:
  49.         lodsb                   ;чтение очередного символа в al, увеличение si на 1
  50.         cmp     al,     Delimiter       ;очередной символ - разделитель слов?
  51.         je      @@NewWord               ;да - перейти к строкам, выполняющим сравнение с образцом
  52.         loop    @@For           ;
  53.         ;здесь обработка последнего слова в строке
  54.         inc     si              ;для проверки последнего слова
  55. @@NewWord:
  56.         pushf
  57.         cld
  58.         ;сравнить длины слов
  59.         mov     ax,     si
  60.         sub     ax,     di
  61.         dec     ax
  62.         cmp     ax,     dx
  63.         jne     @@Next
  64.         ;при равенстве - сравнить слова
  65.         push    si
  66.         push    di
  67.         push    cx
  68.         push    es
  69.         push    ds
  70.         pop     es
  71.         mov     cx,     dx
  72.         lea     si,     WordForDelete+1
  73.         repe    cmpsb
  74.         pop     es
  75.         pop     cx
  76.         pop     di
  77.         pop     si
  78.         jne     @@Next
  79.         ;при совпадении слов - удалить из строки слово
  80.         jcxz    @@SkipCopy
  81.         push    cx
  82.         push    si
  83.         push    di
  84.         push    es
  85.         push    ds
  86.         pop     es
  87.         rep     movsb
  88.         pop     es
  89.         pop     di
  90.         pop     si
  91.         pop     cx
  92.         ;после переноса, просмотр продолжать с 1-го символа удалённого слова
  93.         mov     si,     di
  94.         dec     [String] ;удаляется не только слово, но и разделитель
  95. @@SkipCopy:
  96.         ;коррекция длины строки
  97.         sub     [String], dl
  98. @@Next:
  99.         popf
  100.  
  101.         mov     di,     si
  102.         jcxz    @@Break
  103.         loop    @@For
  104. @@Break:
  105.         ;вывод результатов
  106.         mov     ah,     09h
  107.         lea     dx,     msgNewString
  108.         int     21h
  109.         call    ShowString
  110.  
  111.         mov     ah,     09h
  112.         lea     dx,     CrLf
  113.         int     21h
  114.  
  115. @@Exit:
  116.         mov     ax,     4C00h   ;завершение программы
  117.         int     21h
  118. main    endp
  119.  
  120. ;Чтение строки с клавиатуры
  121. ;на входе:
  122. ;  ds:dx - адрес строки
  123. ;на выходе:
  124. ;  ds:dx - строка в Pascal формате (длина, символы)
  125. GetStr  proc
  126.         push    ax
  127.         push    bx
  128.         push    cx
  129.         push    dx
  130.         push    si
  131.         push    di
  132.         pushf
  133.         push    es
  134.  
  135.         mov     bx,     dx      ;сохранение адреса строки
  136.         ;чтение в буфер из клавиатуры
  137.         mov     ah,     0Ah
  138.         lea     dx,     kbdBuffer
  139.         int     21h
  140.         ;перевод строки
  141.         mov     ah,     09h
  142.         lea     dx,     CrLf
  143.         int     21h
  144.         ;копирование из буфера в переменную строки
  145.         mov     cx,     0
  146.         mov     cl,     [kbdBuffer+1]
  147.         ;jcxz    @@SkipCopy
  148.         inc     cx
  149.         push    ds
  150.         pop     es
  151.         lea     si,     kbdBuffer+1
  152.         mov     di,     bx
  153.         cld
  154.         rep     movsb
  155.         ;добавление признака конца строки за последним символом
  156.         mov     byte ptr [di],  '$'
  157. @@SkipCopy:
  158.         pop     es
  159.         popf
  160.         pop     di
  161.         pop     si
  162.         pop     dx
  163.         pop     cx
  164.         pop     bx
  165.         pop     ax
  166.         ret
  167. GetStr  endp
  168.  
  169. ShowString      proc
  170. .386
  171.         pusha
  172.         mov     cx,     0
  173.         mov     cl,     String
  174.         lea     si,     String
  175.         add     si,     cx
  176.         mov     byte ptr [si+1],'$'
  177.  
  178.         mov     ah,     09h
  179.         lea     dx,     String+1
  180.         int     21h
  181.  
  182.         mov     ah,     09h
  183.         lea     dx,     CrLf
  184.         int     21h
  185.         popa
  186.         ret
  187. ShowString      endp
  188.  
  189. end     main

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

В данном коде реализована функция удаления заданного слова из строки, вводимой пользователем. Список переменных и их значений:

  1. kbdBuffer - буфер клавиатуры для ввода строки (в формате 80, ?, 80 dup(0)).
  2. CrLf - символы перевода строки (0Dh, 0Ah, '$').
  3. Delimiter - разделитель слов в строке (' ').
  4. String - строка в формате длина, символы.
  5. WordForDelete - строка в формате длина, символы.
  6. PromptStr - строка для вывода сообщения Enter string:.
  7. PromptWord - строка для вывода сообщения Enter word:.
  8. msgNewString - строка для вывода сообщения Result String:.
  9. ax, bx, cx, dx, si, di, es, ds, pe, pf, bp, sp, stack_top - регистры и переменные для работы со строками и обработки ввода-вывода. Описание действий:
  10. Ввод строки с клавиатуры с помощью функции GetStr.
  11. Ввод слова для удаления из строки с помощью функции GetStr.
  12. Цикл выделения слов и сравнения их с удаляемым словом.
  13. Если строка пустая, завершение программы.
  14. Выделение длины и символов удаляемого слова.
  15. Сравнение длин слов, если они равны, переход к сравнению слов.
  16. Если слова совпадают, удаление слова из строки.
  17. Вывод результатов с помощью функции ShowString.
  18. Ввод символов перевода строки.
  19. Завершение программы.

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


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

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

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы