Замена символов в строке - 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