Удаление повторяющихся символов из строки - Assembler

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

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

Есть задание: Отредактировать введенную строку, удаляя из него буквы, которые встречаются заданное число раз (количество повторов вводиться пользователем в процессе выполнения программы).
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
есть такой код. если ввожу букву которую нужно удалить при определенном количестве повторов программа работает. не могу сделать чтобы символ в регистр al записывался из строки. пробовал заменить
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    ; задается количество символов в строке
вроде команда lods strring должна записывать в регистр al первый символ из строки. у меня в отладчике при таком коде в регистр al записывается значение 0В46. может кто-то подскажет
Проблема локализовалась до следующего вопроса:
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
если в string в коде записываешь строку, то lods string считывает первый файл, т.е. все прекрасно, но если оставляю значение string db 100,100 dup ('$') и ввожу строку с клавиатуры, в аl записывается ерунда.

Решение задачи: «Удаление повторяющихся символов из строки»

textual
Листинг программы
    mov ax,@data
    mov ds,ax

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


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

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

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