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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        kbdBuffer       db      80, ?, 80 dup(0)        ;буфер клавиатуры для ввода строки
        CrLf            db      0Dh, 0Ah, '$'           ;символы перевода строки
 
        Delimiter       db      ' '                     ;разделитель слов в строке
        String          db      ?, 80 dup(0)            ;строка в формате длина, символы
        WordForDelete   db      ?, 80 dup(0)            ;строка в формате длина, символы
 
        PromptStr       db      'Enter string:', 0Dh, 0Ah, '$'
        PromptWord      db      'Enter word:', 0Dh, 0Ah, '$'
        msgNewString    db      'Result String: ', 0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод строки
        mov     ah,     09h
        lea     dx,     PromptStr
        int     21h
        lea     dx,     String
        call    GetStr
        ;ввод слова для удаления из строки
        mov     ah,     09h
        lea     dx,     PromptWord
        int     21h
        lea     dx,     WordForDelete
        call    GetStr
 
        ;цикл выделения слов и сравнения их с удаляемым словом
 
        mov     cx,     0       ;cx - длина строки
        mov     cl,     String
        jcxz    @@Break         ;если строка пустая - завершить программу
        mov     dx,     0       ;dx - длина удаляемого слова
        mov     dl,     WordForDelete
        or      dx,     dx
        jz      @@Break
        lea     si,     String+1 ;si - адрес первого символа строки
        mov     di,     si      ;di - адрес начала слова в строке
@@For:
        lodsb                   ;чтение очередного символа в al, увеличение si на 1
        cmp     al,     Delimiter       ;очередной символ - разделитель слов?
        je      @@NewWord               ;да - перейти к строкам, выполняющим сравнение с образцом
        loop    @@For           ;
        ;здесь обработка последнего слова в строке
        inc     si              ;для проверки последнего слова
@@NewWord:
        pushf
        cld
        ;сравнить длины слов
        mov     ax,     si
        sub     ax,     di
        dec     ax
        cmp     ax,     dx
        jne     @@Next
        ;при равенстве - сравнить слова
        push    si
        push    di
        push    cx
        push    es
        push    ds
        pop     es
        mov     cx,     dx
        lea     si,     WordForDelete+1
        repe    cmpsb
        pop     es
        pop     cx
        pop     di
        pop     si
        jne     @@Next
        ;при совпадении слов - удалить из строки слово
        jcxz    @@SkipCopy
        push    cx
        push    si
        push    di
        push    es
        push    ds
        pop     es
        rep     movsb
        pop     es
        pop     di
        pop     si
        pop     cx
        ;после переноса, просмотр продолжать с 1-го символа удалённого слова
        mov     si,     di
        dec     [String] ;удаляется не только слово, но и разделитель
@@SkipCopy:
        ;коррекция длины строки
        sub     [String], dl
@@Next:
        popf
 
        mov     di,     si
        jcxz    @@Break
        loop    @@For
@@Break:
        ;вывод результатов
        mov     ah,     09h
        lea     dx,     msgNewString
        int     21h
        call    ShowString
 
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
@@Exit:
        mov     ax,     4C00h   ;завершение программы
        int     21h
main    endp
 
;Чтение строки с клавиатуры
;на входе:
;  ds:dx - адрес строки
;на выходе:
;  ds:dx - строка в Pascal формате (длина, символы)
GetStr  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        pushf
        push    es
 
        mov     bx,     dx      ;сохранение адреса строки
        ;чтение в буфер из клавиатуры
        mov     ah,     0Ah
        lea     dx,     kbdBuffer
        int     21h
        ;перевод строки
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;копирование из буфера в переменную строки
        mov     cx,     0
        mov     cl,     [kbdBuffer+1]
        ;jcxz    @@SkipCopy
        inc     cx
        push    ds
        pop     es
        lea     si,     kbdBuffer+1
        mov     di,     bx
        cld
        rep     movsb
        ;добавление признака конца строки за последним символом
        mov     byte ptr [di],  '$'
@@SkipCopy:
        pop     es
        popf
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
GetStr  endp
 
ShowString      proc
.386
        pusha
        mov     cx,     0
        mov     cl,     String
        lea     si,     String
        add     si,     cx
        mov     byte ptr [si+1],'$'
 
        mov     ah,     09h
        lea     dx,     String+1
        int     21h
 
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        popa
        ret
ShowString      endp
 
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
Похожие ответы