Удалить из строки слова, имеющие определенную букву - Assembler

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

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

Удалить из строки слова, имеющие определенную букву, например D. Строка задана сразу. Подскажите пожалуйста как решить эту задачу

Решение задачи: «Удалить из строки слова, имеющие определенную букву»

textual
Листинг программы
; multi-segment executable file template.
data segment
    msg db 'vvedi stroku: $' 
    buffer db 15 
    bufferl db ?
    mas1 db 15 dup(?)
    str db 0Dh, 0Ah, '$'
    space db 20h
    literal db 097 
                      
ends
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    xor ax, ax
    xor cx, cx
    
    
    
    mov dx, offset msg   ; vivod msg
    mov ah, 9
    int 21h
    
    mov dx, offset buffer; vvod v massive
    mov ah, 0Ah
    int 21h 
    
    mov dx, offset str   ; perehod na novvyu stroky
    mov ah, 9
    int 21h
    
    mov dx, offset mas1  ; vivod massive
    mov ah, 9
    int 21h 
    
    mov dx, offset str   ; perehod na novvyu stroky
    mov ah, 9
    int 21h
    
    xor cx, cx              
    mov cl, bufferl
    lea di, mas1   ; end
    lea si, mas1   ; start 
    push si
    push di
 
cycle:   
    pop di
    pop si
    mov al, space 
    repne scasb    ; search space 
    jnz scanoneword
    push di
    push si 
    mov bx, di
    sub bx, si
    jmp scan       
scanoneword: 
    mov bx, di
    sub bx, si 
    mov dl, bufferl
    sub dx, bx
    push di
    mov cx, dx
    mov al, literal 
    mov si, di
    repne scasb
    jnz exit  
    ;pop di
    mov bx, di
    mov di, si
    mov si, di
    add di, dx
    mov cx, dx
    repne movsb
    jmp exit
scan:
    mov al, literal
    mov bx, di
    sub bx, si
    push di
    mov cx, bx
    mov al, literal 
    mov di, si
    repne scasb
    push si
    push di
    jnz cycle  
    pop di
    mov bx, di
    mov di, si
    mov si, bx
    repne movsb
    push si
    push di
    jmp cycle
    
exit:    
    
    
    mov dx, offset mas1
    mov ah, 9
    int 21h
    
    
 
    
 
    
    
    
             
             
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
 
end start ; set entry point and stop the assembler.

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

  1. Здесь объявляются сегменты данных и кода.
  2. Объявляются переменные:
    • msg содержит строку 'vvedi stroku: $'
    • buffer представляет собой буфер длиной 15
    • bufferl используется для хранения длины строки в буфере
    • mas1 - массив из 15 элементов, заполненный неопределенными значениями
    • str - строчная переменная, содержащая символ перевода строки и символ завершения строки
    • space - содержит символ пробела
    • literal - содержит символ 097
  3. В сегменте кода начинается программа:
    • Устанавливаются регистры сегмента с помощью команд mov ax, data, mov ds, ax, mov es, ax
    • Затем устанавливаются некоторые регистры в 0 с помощью команд xor ax, ax, xor cx, cx
    • Выводится сообщение с помощью команды mov dx, offset msg, mov ah, 9, int 21h
    • Вводится строка с помощью int 21h и записывается в буфер buffer
    • Далее выводится новая строка, затем выводится массив mas1
    • Затем с помощью цикла и операций сдвига, сравнения и копирования производится обработка введенной строки согласно комментариям в коде
    • Наконец, обработанная строка выводится и программа завершается с помощью команды int 21h.
  4. В этом коде происходит чтение строки с клавиатуры, удаление слов, содержащих определенную букву, и вывод обновленной строки.

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

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