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