Работа со строками - Assembler (226006)

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

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

Задание: убрать повторяющиеся пробелы. Проблема: пробелы программа убирает, но выводит в конце лишнюю строку при проверке на повторяющиеся пробелы.
sseg segment para stack
db 100 dup(?)               ;стек - не менее 32 слов
sseg ends
dseg segment
entrs db 100 dup(?)         ;вводимая строка
prnts db 100 dup(?)         ;выводимая строка
hello db "Enter string:$"
prevdi dw 0
dseg ends
cseg segment
assume cs:cseg, ds:dseg, ss:sseg
main proc
    mov ax, dseg        ;обе строки в одном
    mov es, ax          ;сегменте
    mov ds, ax
    int 21h
    mov ah, 9
    lea dx, hello
    int 21h
    mov ah, 3fh         ;ввод строки
    mov dx, offset entrs
    mov bx, 0
    mov cx, 100
    int 21h
    sub ax, 1           ;кол-во символов -код клавиши enter
    push ax         ;в стеке кол-во повторений
    mov al, ' '         ;в al символ пробела
    lea di, entrs           ;entrs - приёмник
    lea si, prnts           ;для сканирования
    lea dx, entrs       ;сохр. в dx, bx entrs - источник
    lea bx, prnts       ;prints - приёмник
                    ;для копирования
again:  
    pop cx
    cmp cx, 0           ;если 0, то fin
    je fin
    mov prevdi, di      ;предыдущее кол-во проскан. символов
    repne scasb     ;проверяем до пробела
    push cx         ;сохр. кол-во не сканированных символов
    push di         ;сохраняем значения, чтобы потом
                    ;продолжить сканировать
    sub di, prevdi      ;di - кол-во скан. символов -prevdi
    mov cx, di          ;кол-во символов - кол-во повторений
    mov si, dx          ;введённая строка теперь строка-источник
    mov di, bx          ;вывод. строка - строка-приёмник
    rep movsb           ;записываем все символы с первым пробелом
    mov dx, si          ;сохраняем значения регистров, чтобы
    mov bx, di          ;продолжить потом записывать
    pop di          ;di значения для сканирования
check:
    cmp entrs[di], ' '      ;проверяем след символ с пробелом
    jne again           ;если равно то сдвигаем разряд вправо
    inc di              ;проверяем следующий символ пока не
    inc dx              ;не будет равняться пробелу
    jmp check
fin:
    mov prnts[si], '$'      ;помещяем '$' в конец (si - послед.
    mov ah, 9           ;символ)
    mov dx, offset prnts    ;выводим строку prnts с рузельтатом
    int 21h         ;копирования
mov ah, 4ch
int 21h
main endp
cseg ends
end main

Решение задачи: «Работа со строками»

textual
Листинг программы
.model  small
.386
dos_inp macro   lbl, sz
_ib_    struc  
max db  sz      ; наибольшая длина строки
len db  ?               ; сюда вернется настоящая длина
bf  db  sz dup(?)   ; тут будет то, что ввели
_ib_    ends            
lbl _ib_ <>
endm
.stack  100
.data
req db  'Enter string:$'
dos_inp buf, 100
.code   
start:  
    mov ax, @data
    mov ds, ax
    mov es, ax
; Вывод на экран 
    mov     ah, 09h
    lea     dx, req
    int     21h
; ввод строки
    mov ah, 0Ah
    lea dx, buf
    int 21h
;;
    movzx   cx, byte ptr buf.len
    lea si, buf.bf
    mov di, si
@loop:  lodsb
    cmp al, ' '
    jnz @non_sp
    cmp byte ptr [si], ' '
    jnz @non_sp
    jmp @next
@non_sp:
    stosb
@next:  loop    @loop
    mov al, '$'
    stosb
    mov bx, dx
    mov word ptr [bx], 0D0Ah
; Вывод на экран 
    mov     ah, 09h
    int     21h
; выход
    mov ah, 4Ch
    int 21h
    end start

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


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

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

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