汇编 - 替换一个词

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 部分对我来说非常不清楚。你需要整个重做。