Замена символов в строке - Assembler

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

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

В общем задача - заменить все точки в двух строках на восклицательные знаки. Пробую это сделать для второй строки сначала - не выходит.
assume cs: code
 
data1 segment
    buffer db 254,0,254 dup ('$')
    str1 db 'enter  string:', 0Dh, 0Ah, '$'
    str3 db 0Dh, 0Ah, '$'
    str2 db 'result:', 0Dh, 0Ah, '$'
data1 ends
 
data2 segment
    buffer2 db 254,0,254 dup ('$')
    str4 db 'enter  string:', 0Dh, 0Ah, '$'
    str6 db 0Dh, 0Ah, '$'
    str5 db 'result:', 0Dh, 0Ah, '$'
data2 ends
 
code segment
start:
   ;Ввод строки 1
    mov ax, data1
    mov ds, ax
    
    mov ah,09h
    mov dx, offset str1 
    int 21h
 
    mov ah,0ah
    mov dx, offset buffer  
    int 21h
 
    mov ah,09h
    mov dx, offset str3
    int 21h
 
   ;;;;; Ввод строки 2
    
    mov ax, data2
    mov ds, ax
 
    mov ah,09h
    mov dx, offset str4
    int 21h
 
    mov ah,0ah
    mov dx, offset buffer2  
    int 21h
 
    mov ah,09h
    mov dx, offset str6
    int 21h
 
;;;;;; Очистка экрана
    mov ah,0
    mov al,2
    int 10h

;;;; Вывод строки 1
    mov ax,data1
    mov ds,ax
 
    mov ah,09h
    mov dx, offset str2
    int 21h
 
    mov ah,09h
    lea dx, buffer+2
    int 21h
 
    mov ah,09h
    mov dx, offset str3
    int 21h
 
;;;; Вывод строки 2
    mov ax, data2
    mov ds, ax    
 
    mov ah,09h
    mov dx, offset str5
    int 21h
 
    mov ah,09h
    lea dx, buffer2+2
    int 21h
    ;;;
 
;;;;;   Замена . на !
     mov ax, data2
     mov ds, ax  
     MOV  AL,'.'  ;Искомый символ.
     CLD                    ;Установка флага направления в 0.
              MOV  CX,254        ;Макс. длина поля buffer2
              LEA  DI,buffer2         ;Адрес поля buffer2
              REPNE SCASB            ;Поиск.
              JNZ  K20               ;Символ найден?
          DEC  DI                ;Да - уменьшить адрес.
              MOV  BYTE PTR[DI],21H
     K20:      RET
;;;;; Вывод строки 2 после изменения
    
    mov ah,09h
    mov dx, offset str6
    int 21h
    
    mov ah,09h
    mov dx, offset str5
    int 21h
 
    mov ah,09h
    lea dx, buffer2+2
    int 21h
 
quit:
    mov ax, 4c00h
    int 21h
    code ends
    end start

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

textual
Листинг программы
dos_inp macro lbl, sz
_ib_    struc
max db sz
len db ?
bf  db sz dup('$')
_ib_    ends
lbl _ib_ <>
endm
 
.model  small
.386
.stack
.data
entr    db 0Dh, 0Ah,'enter  string:$'
crlf    db 0Dh, 0Ah, '$'
rslt    db 0Dh, 0Ah,'result:$'
dos_inp buffer, 80
dos_inp buffer2,80
 
.code
start:
;Ввод строки 1
    mov ax, @data
    mov ds, ax
    mov es, ax
 
    mov ah,09h
    lea dx, entr
    int 21h
 
    mov ah,0ah
    lea dx, buffer
    int 21h
 
    mov ah,09h
    lea dx, crlf
    int 21h
 
;;;;; Ввод строки 2
    mov ah,09h
    lea dx, entr
    int 21h
 
    mov ah,0ah
    lea dx, buffer2
    int 21h
 
;;;; Вывод строки 1
 
    mov ah,09h
    lea dx, rslt
    int 21h
 
    mov ah,09h
    lea dx, buffer.bf
    int 21h
 
;;;; Вывод строки 2
 
    mov ah,09h
    lea dx, rslt
    int 21h
 
    mov ah,09h
    lea dx, buffer2.bf
    int 21h
 
;;;;;   Замена . на !
    MOVzx   CX, buffer2.len     ;Макс. длина поля buffer2
    lea si, buffer2.bf      ;Адрес поля buffer2
l1:;                ;Поиск.
    lodsb
    cmp al, 2Eh
    JNZ K20         ;Символ найден?
    MOV BYTE PTR[si-1], 21h
K20:    loop    l1
 
    mov ah,09h
    lea dx, rslt
    int 21h
 
    mov ah,09h
    lea dx, buffer2.bf
    int 21h
 
quit:
    mov ax, 4c00h
    int 21h
    end start

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


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

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

10   голосов , оценка 4.1 из 5