汇编 - 替换一个词
Assembly - Replace a word
所以,在这个程序中,我需要输入2个字符串。一个到 select 要替换的单词(在 info1 中设置的默认消息上),另一个用于新单词。
就是说,当我们进行实际替换时,我陷入了无限循环。谁能指出我正确的方向? :)
#make_COM#
ORG 100H
.Data
info1 db 'original message:',13,10,'$'
space db 13,10,'$'
msgorig db 'a ana e anita em anadia',13,10,'$'
info2 db 'input the word to be replaced',13,10,'$'
info3 db 'input the replacing word',13,10,'$'
fint db 60 dup(?)
fsubs db 60 dup(?)
.Code
mov ah,9
lea dx, info1
int 21h
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, msgorig
int 21h
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, info2
int 21h
mov ah,9
lea dx, space
int 21h
lea si,fsubs
subs1:
mov ah,1
int 21h
cmp al, 13
Jz subs2
mov [si], al
inc si
jmp subs1
subs2:
mov al, '$'
mov [si],al
mov ah,9
lea dx, space
int 21h
show1:
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, info2
int 21h
lea si,fint
troca1:
mov ah,1
int 21h
cmp al, 13
Jz troca2
mov [si], al
inc si
jmp troca1
troca2:
mov ah,9
lea dx, space
int 21h
mov al, '$'
mov [si],al
tcp:
lea si,msgorig
mov al,[si]
lea si,fsubs ; al e a mensagem origem
mov bl,[si] ;(ana) bl e a string que vai ser substituida
lea si,fint ;(lumiar) dl e a string que vai substituir
mov dl,[si]
tcp1:
cmp al,'$' ; comp se msg org xegou ao fim
jz fim
cmp bl,al ; comp se ana e ana
jz tcp2 ; saltar para tcp2 para substituir
jnz tcp3 ; saltar para tcp3 para inc msg org
tcp2:
inc dl
inc al
cmp al, bl ;cmp mesg org com ana
jnz tcp1 ; se ja nao e salta para tras
inc dl
inc al
mov al,dl ; substitui al[0] por dl[0]
jmp tcp2 ; return again!!!\(O_O)/ Praise the sun
tcp3:
inc al ; inc a pocisao da msg orig
jmp tcp1 ; salta para tras para cmp
fim:
mov ah,4CH
int 21h
这里的基本问题是你混合了指针和值!
在您的 tcp3 标签中,您不想增加 AL 中的字符,而是 指向该字符的指针 。使用多个地址寄存器,如 DI、SI 和 BX 来寻址内存。 (要解放BX你可以在你用BL的地方用AH)
tcp:
lea di,msgorig
mov al,[di]
...
tcp3:
inc di
mov al,[di]
jmp tcp1
下一个代码不替换字符!
mov al,dl ; substitui al[0] por dl[0]
您需要在方便的地址写入DL。
mov [di],dl ;This will substitute
由于上述问题,tcp2 部分对我来说非常不清楚。你需要整个重做。
所以,在这个程序中,我需要输入2个字符串。一个到 select 要替换的单词(在 info1 中设置的默认消息上),另一个用于新单词。
就是说,当我们进行实际替换时,我陷入了无限循环。谁能指出我正确的方向? :)
#make_COM#
ORG 100H
.Data
info1 db 'original message:',13,10,'$'
space db 13,10,'$'
msgorig db 'a ana e anita em anadia',13,10,'$'
info2 db 'input the word to be replaced',13,10,'$'
info3 db 'input the replacing word',13,10,'$'
fint db 60 dup(?)
fsubs db 60 dup(?)
.Code
mov ah,9
lea dx, info1
int 21h
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, msgorig
int 21h
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, info2
int 21h
mov ah,9
lea dx, space
int 21h
lea si,fsubs
subs1:
mov ah,1
int 21h
cmp al, 13
Jz subs2
mov [si], al
inc si
jmp subs1
subs2:
mov al, '$'
mov [si],al
mov ah,9
lea dx, space
int 21h
show1:
mov ah,9
lea dx, space
int 21h
mov ah,9
lea dx, info2
int 21h
lea si,fint
troca1:
mov ah,1
int 21h
cmp al, 13
Jz troca2
mov [si], al
inc si
jmp troca1
troca2:
mov ah,9
lea dx, space
int 21h
mov al, '$'
mov [si],al
tcp:
lea si,msgorig
mov al,[si]
lea si,fsubs ; al e a mensagem origem
mov bl,[si] ;(ana) bl e a string que vai ser substituida
lea si,fint ;(lumiar) dl e a string que vai substituir
mov dl,[si]
tcp1:
cmp al,'$' ; comp se msg org xegou ao fim
jz fim
cmp bl,al ; comp se ana e ana
jz tcp2 ; saltar para tcp2 para substituir
jnz tcp3 ; saltar para tcp3 para inc msg org
tcp2:
inc dl
inc al
cmp al, bl ;cmp mesg org com ana
jnz tcp1 ; se ja nao e salta para tras
inc dl
inc al
mov al,dl ; substitui al[0] por dl[0]
jmp tcp2 ; return again!!!\(O_O)/ Praise the sun
tcp3:
inc al ; inc a pocisao da msg orig
jmp tcp1 ; salta para tras para cmp
fim:
mov ah,4CH
int 21h
这里的基本问题是你混合了指针和值!
在您的 tcp3 标签中,您不想增加 AL 中的字符,而是 指向该字符的指针 。使用多个地址寄存器,如 DI、SI 和 BX 来寻址内存。 (要解放BX你可以在你用BL的地方用AH)
tcp:
lea di,msgorig
mov al,[di]
...
tcp3:
inc di
mov al,[di]
jmp tcp1
下一个代码不替换字符!
mov al,dl ; substitui al[0] por dl[0]
您需要在方便的地址写入DL。
mov [di],dl ;This will substitute
由于上述问题,tcp2 部分对我来说非常不清楚。你需要整个重做。