装配 - 替换一个单词

时间:2015-02-28 18:22:58

标签: assembly input replace word

所以,在这个程序中,我需要输入2个字符串。一个用于选择要替换的单词(在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

1 个答案:

答案 0 :(得分:2)

这里的基本问题是你混合了指针和值! 在 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 部分对我来说非常不清楚。你需要整修它。