2016-08-08 11 views
1

Je veux concaténer deux chaînes mais dans ma sortie au lieu d'obtenir la chaîne concaténée finale, je reçois une ligne de caractères et d'espaces étranges, peut-être que quelqu'un pourrait m'aider un peu. Je veux enregistrer le résultat en s3. Voici le codeassembly concaténer deux chaînes

DATA SEGMENT 
    STR1 DB "ENTER FIRST STRING HERE ->$" 
    STR2 DB "ENTER SECOND STRING HERE ->$" 
    STR3 DB "CONCATEnatedD STRING :->$" 
    STR11 DB "FIRST STRING : ->$" 
    STR22 DB "SECOND STRING: ->$" 

    s1 DB 20 DUP("$") 
    s2 DB 20 DUP("$") 
    s3 db 40 dup(?) 
    NEWLINE DB 10,13,"$" 

DATA ENDS 

CODE SEGMENT 

    ASSUME DS:DATA,CS:CODE 
START: 

    MOV AX,DATA 
    MOV DS,AX 


lea dx,str1 
mov ah,09h 
int 21h 

lea si,s1 

l1: mov ah,01h 
int 21h 

mov [si],al 
inc si 
cmp al,31h 
jne l1 

dec si 

lea dx,str2 
mov ah,09h 
int 21h 

lea di,s2 

l2: mov ah,01h 
int 21h 

mov [di],al 
inc di 
cmp al,32h 
jnz l2 

lea si,s3 
lea di,s1 


lea si,s3 
lea di,s1 
l3: mov al,[di] 
mov [si],al 
inc si 
inc di 
cmp al,31h 
jnz l3 

dec si 

lea di,s2 

l4: mov al,[di] 
mov [si],al 
inc si 
inc di 
cmp al,32h 
jnz l4 

lea dx,str3 
mov ah,09h 
int 21h 

l5: mov dl,[si] 
cmp dl,32h 
jz l6 
mov ah,02h 
int 21h 
inc si 
jmp l5 


l6:MOV AH,4CH 
    INT 21H 


CODE ENDS 
END START 

J'ai trouvé la solution, l'espoir est un bon sans erreur: segment de données msg db 0Dh, 0Ah, "String1: $" msg2 db 0Dh, 0Ah, " string2: $ » rev db 0Dh, 0Ah, "Résultat: $"

buffer label byte 
buffer2 label byte 
str_maxlen db 255 
str_length db 0 

str_string db 255 dup(0) 
str_string2 db 255 dup(0) 
result db 255 dup('$') 
num db 0 
data ends 

code segment 
assume cs:code, ds:data 
start: 
mov ax,data 
mov ds,ax 

lea dx,msg 
mov ah,09h 
int 21h 

lea dx,buffer 
mov ah,0Ah 
int 21h 

mov cl,str_length 
mov bh,cl 
mov ch,0 
lea si,str_string 
lea di,result 

op1: mov bl,[si] 
mov [di],bl 
inc di 
inc si 
loop op1 

mov cl,bh 
op3: dec si 
loop op3 

lea dx,msg2 
mov ah,09h 
int 21h 

lea dx,buffer2 
mov ah,0Ah 
int 21h 
mov cl,str_length 

lea si,str_string 
mov cl,str_length 

mov ax,0 
op2: mov al,[si] 
mov [di],al 
inc di 
inc si 
loop op2 

lea dx,rev 
mov ah,09h 
int 21h 

lea dx,result 
mov ah,09h 
int 21h 

mov ah,4Ch 
int 21h 
code ends 

end start 
+1

Pourquoi gardez-vous comparer le caractère d'être recopié dans '31h' comme condition de terminaison pour la boucle de copie? '31h' représente l'ASCII pour le chiffre '1'. – lurker

+0

Je vote pour fermer car je crois que c'est un travail à faire et je ne peux pas voir comment OP fait aucun effort pour résoudre leur problème. Peut-être qu'ils ont été encouragés par leur [première tentative réussie d'une solution bon marché] (https://stackoverflow.com/questions/38824670/assembly-reverse-a-string)? –

+0

Ce n'est pas un devoir, juste un passe-temps, et je demande ici en dernier recours quand je ne trouve pas la solution. Et qui a ce genre de devoirs en été? Ceux qui étudient l'assemblage le font à l'université pendant la période scolaire normale, pas en août. – user3848412

Répondre

0

Dans votre premier code, vous devez définir si pour pointer vers le début de la chaîne s3 juste avant l'étiquette l5: (parce que si pointait à la fin de la boucle après s3l4:):

. 
. 
. 
lea dx,str3 
mov ah,09h 
int 21h 

lea si,s3   ;◄■■■■■■■■■■■ 
l5: mov dl,[si] 
cmp dl,32h 
jz l6 
. 
. 
.