Удаление повторяющихся символов из строки - Assembler
Формулировка задачи:
Есть задание: Отредактировать введенную строку, удаляя из него буквы, которые встречаются заданное число раз (количество повторов вводиться пользователем в процессе выполнения программы).
есть такой код. если ввожу букву которую нужно удалить при определенном количестве повторов программа работает. не могу сделать чтобы символ в регистр al записывался из строки.
пробовал заменить этот участок на такой
вроде команда lods strring должна записывать в регистр al первый символ из строки. у меня в отладчике при таком коде в регистр al записывается значение 0В46.
может кто-то подскажет
если в string в коде записываешь строку, то lods string считывает первый файл, т.е. все прекрасно, но если оставляю значение string db 100,100 dup ('$') и ввожу строку с клавиатуры, в аl записывается ерунда.
masm model small .data string db 100,100 dup ('$') str db 'vvedite stroku:$' povt db "Kolichestvo povtorov:$" s2 db "sovpal","$" per db 00h sr db (?) [COLOR="Red"]symbol db "a"[/COLOR] ;ввожу букву для повтора вручную .code assume ds:@data, es:@data prog: mov ax,@data mov ds,ax mov ah,09h mov dx,OFFSET str int 21h mov ah,0ah lea dx,string int 21h ;Vveli stroku_____________________ MOV AH,02 ;Запрос на установку курсора MOV BH,00 ;Экран 0 MOV DH,02 ;Строка 02 MOV DL,00 ;Столбец 1 INT 10H mov ax,@data mov ds,ax mov ah,09h mov dx,OFFSET povt int 21h mov ah,01h ;DOS функция чтения символа int 21h ;вызов DOS прерывания cmp al,39h jle m1 jmp m2 m1: sub al,30h jmp m3 m2: sub al,37h jmp m3 m3: mov sr,al mov ah,01h ;DOS функция чтения символа int 21h ;вызов DOS прерывания ;Вводим число повторений___________ mov ax, @data mov ds, ax mov es, ax cld lea di, string ; в di записывается адрес строки str mov al, symbol mov cx, 20 ; задается количество символов в строке met1: repne scas string ; поиск в строке продолжается пока не будет ; встречен заданный символ, код которого ; находиться в al jcxz equal ; выход из процедуры поиска если достигнут ; конец строки add per, 01h ; увеличение счетчика совпадений jmp met1 equal: mov al, per cmp al, sr ; сравнение количества найденных символов с заданым je m21 jmp exit m21: MOV AH,02 ;Запрос на установку курсора MOV BH,00 ;Экран 0 MOV DH,03 ;Строка 10 MOV DL,00 ;Столбец INT 10H mov ax,@data mov ds,ax mov ah,09h mov dx,OFFSET s2 int 21h cld lea di, string mov al, symbol mov cx,20 udal: repne scas string ; поиск в строке продолжается пока не будет jcxz exit ; выход из про mov dx,cx push si mov si,di dec di mov bx,di rep movsb mov di,bx mov cx,dx pop si jmp udal exit: ;vivod stroki____________________________ MOV AH,02 ;Запрос на установку курсора MOV BH,00 ;Экран 0 MOV DH,10 ;Строка 10 MOV DL,00 ;Столбец INT 10H lea di,string mov string+1,0ah mov ah,9 lea dx,string+1 int 21h mov ah, 10h int 16h mov ax, 4c00h int 21h code ends end prog
cld lea di, string ; в di записывается адрес строки str mov al, symbol mov cx, 20 ; задается количество символов в строке
cld lea si, string ; указатель на заданную строку mov cx, 20 ; количество выводимых символов lods string ; загрузка в регистр AL символа из строки на lea di, string ; в di записывается адрес строки str mov cx, 20 ; задается количество символов в строке
Проблема локализовалась до следующего вопроса:
masm model small .data string db 100,100 dup ('$') ; ЧТо-то не так с этим значением ( я честно не очень понимаю для чего оно) str db 'vvedite stroku:$' povt db "Kolichestvo povtorov:$" s2 db "sovpal","$" per db 00h sr db (?) symbol db "a" .code assume ds:@data, es:@data prog: mov ah,0ah lea dx,string int 21h ;Vveli stroku_____________________ mov ah, 00h mov al, 03h int 10h mov ax, @data mov ds, ax mov es, ax cld lea si, string ; указатель на заданную строку mov cx, 20 ; количество выводимых символов lods string mov ah,01h int 21h mov ax,4c00h int 21h end prog
Решение задачи: «Удаление повторяющихся символов из строки»
textual
Листинг программы
mov ax,@data mov ds,ax
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д