2015-02-28 2 views
1

Donc, dans ce programme, j'ai besoin d'entrer 2 chaînes. Un pour sélectionner le mot à remplacer (sur le message par défaut défini dans info1) et un autre pour le nouveau mot. Cela dit, quand nous arrivons au remplacement réel, je suis coincé dans une boucle infinie. Est-ce que quelqu'un peut-il me montrer la bonne direction? :)Assemblage - Remplacer un mot

#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 

Répondre

2

Le problème de base ici est que vous mélangez des pointeurs et des valeurs!
A votre tcp3 étiquette vous ne voulez pas incrémenter le caractère dans AL mais le pointeur à ce caractère. Utilisez plusieurs registres d'adresses comme DI, SI et BX pour adresser la mémoire. (Pour libérer BX vous pouvez utiliser AH où vous avez utilisé BL)

tcp: 
lea di,msgorig 
mov al,[di] 
... 
tcp3: 
inc di 
mov al,[di] 
jmp tcp1 

Le code suivant ne se substitue pas les caractères!

mov al,dl ; substitui al[0] por dl[0] 

Vous devez écrire DL à une adresse appropriée.

mov [di],dl ;This will substitute 

La partie TCP2 est très clair pour moi à cause des problèmes forementioned. Vous devez retravailler tout.