Удалить в тексте лишние пробелы, оставив между словами не больше двух пробелов - Assembler

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

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

Есть строка str1 (в строке предложение и между словами может быть от 0 до n пробелов). Как сделать так чтобы переписать строку str1 в str2 и в ней осталось не больше двух пробелов, я начал писать и завис, ругает команду сканирования scasb
.model small
.8086
 
.data
str1 db 'Для    чего  они    нужны и как их использовать$'
;строка которую копируют 
str2 db 50 dup (' ') 
;строка в которую копируют
n=$-string ;длина строки
 
.stack 256
 
.code 
start: 
 
mov ax, data
mov ds, ax 
mov es, ax
 
cld    ;обработка от начала к концу
lea si, str1    ;цепочка-источник
lea di, str2    ;цепочка-приемник
mov cx, n      ;загрузка кол-ва эл-тов 
mov al, ' '    ;загрузка символа пробела 
push si
push cx 
rep scasb str1       ;cканирование цепочки    
mov cx, si
sub cx, bx
mov bx, si     ;хранить в регистре индекс
pop cx
pop si     
rep movsb      ;копируем строки
    mov ah, 09 
    lea dx, str2 ;выводим строку
    int 21h
    
    mov ax, 4c00h ;перессылка функции выхода из программы
    int 21h
 
end start

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

textual
Листинг программы
.model small
.8086
 
.data
        ;строка которую копируют
        str1    db      'Для    чего  они    нужны и как их использовать$'
        ;строка в которую копируют
        str2    db      50 dup (?)
        ;перевод строки
        CrLf    db      0Dh, 0Ah, '$'
        TERMINATOR      equ     '$'
 
.stack 256
 
.code
start:
 
        mov     ax,     @data
        mov     ds,     ax
        mov     es,     ax
 
        ;вывод исходной строки
        mov     ah,     09h
        lea     dx,     [str1]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        ;обработка строки с размещением результата в новой строке
        ;пусть признаком конца строки является символ '$'
        cld                     ;обработка от начала к концу
        lea     si,     [str1]  ;цепочка-источник
        lea     di,     [str2]  ;цепочка-приемник
        mov     bx,     0       ;счётчик пробелов
        @@Repeat:
                lodsb           ;считать в al очередной символ
                cmp     al,     ' '
                jne     @@NoSpace
                inc     bx      ;увеличить счетчик пробелов на 1
                jmp     @@IsAboveTwoSpaces
        @@NoSpace:
                mov     bx,     0       ;счётчику пробелов присвоить 0
        @@IsAboveTwoSpaces:
                cmp     bx,     2       ;если количество пробелов не превышает 2
                ja      @@SkipCharCopy
                stosb           ;сохранить символ в результирующей строке
        @@SkipCharCopy:
        @@Until:
                ;это символ - признак конца строки?
                cmp     al,     TERMINATOR
        jne     @@Repeat
        ;вывод результирующей строки
        mov     ah,     09h
        lea     dx,     [str2]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        mov     ax,     4c00h ;перессылка функции выхода из программы
        int     21h
 
end start

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


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

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

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