Удалить в тексте лишние пробелы, оставив между словами не больше двух пробелов - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д