Заменить заданный символ в строке на указанный символ - Assembler

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

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

Ребят, нашел вот такой код, должен заменить заданный символ в строке на указанный символ, а он какой то дурью занимается, не подскажете как исправить?
.model small
.stack 100h
.data
msg1       db    1, 3, 6, 8  
Stroka     db     60, 60 dup (?)
msg2       db    1, 3, 6, 8 
len1       db     ?
msg3       db     5, 7, 9, 2 
msg4       db     5, 7, 9, 2 
len2       db     ?
NextLine   db    1, 3, 6, 8
.code
mov ax, @data   
mov ds, ax  
mov es, ax  
 
;---------вывод 1-го сообщения---------;
mov ah, 09h
mov dx, offset msg1
int 21h 
 
;--------ввод строки--------;
   lea dx, Stroka
   mov ah, 0Ah 
   int 21h
   
   lea bx, Stroka
   inc bx
   mov cl, [bx]
   xor ch, ch   ; теперь CX = длина строки
   inc bx
   add bx, cx
   mov al, 0
   mov [bx], al
      
;---------следующая строка---------;   
   lea dx, nextLine
   mov ah, 9
   int 21h  
   
;----------вывод 2-го сообщения-------;   
   lea dx, msg2
   mov ah, 9
   int 21h
   
;--------ввод символа-------;  
   mov ah, 01 
   int 21h
   mov len1, al
   mov bl, al ; сохраним в BL
   
;---------следующая строка---------;   
   lea dx, nextLine
   mov ah, 9
   int 21h
   
;----------вывод 3-го сообщения--------;   
   lea dx, msg3
   mov ah, 9
   int 21h
   
;------ввод символа-----;  
   mov ah, 01 
   int 21h
   mov len2, al
   mov bh, al
   
;--------ищем символ-------------;
   lea si, Stroka
   add si, 2
   
;-----------переход на следующий символ----------;   
sleduiushii_simvol:  mov al, [si]
                     or  al, al ; это ноль (конец строки)?
                     jnz proverka ; переход, если не 0
                     jmp simvola_net ; дошли до конца, так и встретили 
   
;-------------сравниваем символы------------;     
proverka:   cmp al, bl
            je  naiden
            inc si
            jmp sleduiushii_simvol
   
;---------символ найден-----------;   
naiden:    mov [si], bh ; заменили - больше ничего делать не надо - просто покажем 
           
;------------следующая строка----------;           
           lea dx, nextLine
           mov ah, 9
           int 21h
     
;-------------вывод преобразованной строки------------;
   lea dx, Stroka
   add dx, 2 ; пропускаем байты длины
   mov ah, 40h
   mov bx, 1 ; стандартый вывод
   push cx ; сохраним CX
   int 21h
   pop  cx  ; восстановим CX
 
;----------------следующая строка--------------ж
  lea dx, nextLine
  mov ah, 9
  int 21h
   
;----------вывод 4-го сообщения----------; 
 simvola_net:   lea dx, msg4
                mov ah, 9
                int 21h
                
;-------------завершение программы-----------;   
mov ah, 04Ch    
int 21h
end

Решение задачи: «Заменить заданный символ в строке на указанный символ»

textual
Листинг программы
model small
 stack 128
dataseg
             simvol db 0
             zamena db 0
              size_ db 0
     vvedite_massiv db 'VVedite massiv (max-253 byte): ',0dh,0ah,'$'
             massiv db 255, 255 dup (90h)
     perevod_stroki db 0dh,0ah,'$'
  simvol_dly_poiska db 'Vvedite simvol dly poiska : $'
  simvol_dly_zameni db 'Vvedite simvol dly zameni : $'
 
codeseg
.386
org 100h
start:
 mov ax,@data
 mov ds,ax
 mov es,ax
 
 mov ah,09h
 mov dx,offset vvedite_massiv
 int 21h
 mov ah,0ah
 mov dx,offset massiv
 int 21h
 mov ah,09
 mov dx,offset perevod_stroki
 int 21h
 
 mov ah,09h
 mov dx,offset simvol_dly_poiska
 int 21h
 mov ah,01h
 int 21h
 mov [simvol],al
 mov ah,09
 mov dx,offset perevod_stroki
 int 21h
 
 mov ah,09h
 mov dx,offset simvol_dly_zameni
 int 21h
 mov ah,01h
 int 21h
 mov [zamena],al
 mov ah,09
 mov dx,offset perevod_stroki
 int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 mov si,offset massiv
 inc si
 mov al,[si]
 mov [size_],al
 
 xor cx,cx
 mov cl,[size_]
 
mass_1:
 inc si
 mov al,[si]
 cmp al,[simvol]
 jne mass_2
 
 mov al,[zamena]
 mov [si],al
 
mass_2:
 loop mass_1
 
 cld
 mov di,offset massiv
 xor bx,bx
 mov bl,[size_]
 add di,bx
 add di,2
 mov si,offset perevod_stroki
 mov cx,3
 rep movsb
 
 mov ah,09h
 mov dx,offset massiv + 2
 int 21h
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
exit:
 mov ax,4c00h
 int 21h
end start

Объяснение кода листинга программы

Код на ассемблере выполняет следующие действия:

  1. Запрос на ввод строки для замены (массив размером до 253 байт).
  2. Запрос на ввод символа для поиска.
  3. Поиск введенного символа в строке (массив символов от 0 до 252).
  4. Если символ найден, то происходит замена на другой введенный символ.
  5. Вывод сообщения об успешной замене.
  6. Запрос на ввод символа для замены.
  7. Запрос на ввод символа для поиска.
  8. Поиск введенного символа в строке (массив символов от 0 до 252).
  9. Если символ найден, то происходит замена на другой введенный символ.
  10. Вывод сообщения об успешной замене.
  11. Запрос на ввод строки для замены (массив размером до 253 байт).
  12. Запрос на ввод символа для поиска.
  13. Поиск введенного символа в строке (массив символов от 0 до 252).
  14. Если символ найден, то происходит замена на другой введенный символ.
  15. Вывод сообщения об успешной замене.
  16. Запрос на ввод символа для замены.
  17. Запрос на ввод символа для поиска.
  18. Поиск введенного символа в строке (массив символов от 0 до 252).
  19. Если символ найден, то происходит замена на другой введенный символ.
  20. Вывод сообщения об успешной замене.

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


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

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

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