Замена одного символа на два - Assembler
Формулировка задачи:
Нужно заменить в строке все символы # на &&. Нужно применять цепочечные команды. После первой замены исходная строка перестает копироваться в результирующую. При исходной строке 123#12345 в результат копируется только 123&&.
data segment para public "data"
source db 127 dup('$')
marker db 127 dup('#')
result db 256 dup('$')
tmp_cx db ?
alt_si db 0
first db 1
iter db 0
data ends
code segment para public "code"
start:
assume ds:data,cs:code,es:data
mov ax,data
mov ds,ax
mov es,ax
cld
prog:
mov si,0
mov cx,127
inp:
mov ah, 01h
int 21h
cmp al,0dh
je inp_end
mov source[si], al
inc si
loop inp
inp_end:
xor bx,bx
mov bx,0
lea si,source
lea di,marker
xor cx,cx
mov cx,127
n1:
repne cmps source,marker
cmp cx,0
je nxt
mov tmp_cx,cl
xor cx,cx
mov cl,126
sub cl,tmp_cx
lp:
mov al,source[bx]
add bl,iter
mov result[bx],al
sub bl,iter
inc bx
loop lp
mov result[bx],'&'
inc bx
mov result[bx],'&'
inc iter
mov cl,tmp_cx
inc si
inc di
loop n1
nxt:
mov si,0
mov cx,255
outp:
cmp result[si],'$'
;je stp
mov ah,02h
mov dl, result[si]
int 21h
inc si
loop outp
stp:
mov AX,4c00h
int 21h
code ends
end startРешение задачи: «Замена одного символа на два»
textual
Листинг программы
std rep movsb
Объяснение кода листинга программы
- Указатель на область памяти, содержащую символы, которые нужно заменить, хранится в переменной
std. - Команда
rep movsbиспользуется для повторяющегося копирования байтов из одной области памяти в другую.repуказывает, что операция должна быть повторена несколько раз.movsbкопирует один байт из исходной области памяти в указанное место.
- В результате выполнения этой команды, символы, хранящиеся в области памяти, на которую указывает
std, будут заменены на другие символы или копии самих себя. Точное значение этих символов зависит от того, как именно сконфигурированы перед использованием команды.