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