2016-08-08 36 views
1

Ich möchte zwei Strings verketten, aber in meiner Ausgabe, anstatt die endgültige verkettete Zeichenfolge, bekomme ich eine Reihe von seltsamen Zeichen und Leerzeichen, vielleicht könnte mir jemand ein wenig helfen. Ich möchte das Ergebnis in S3 speichern. Hier ist der CodeAssembly verketten zwei Strings

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 

ich die Lösung gefunden zu haben, hoffe, es ist gut ohne Fehler: Datensegment msg db 0Dh 0Ah "String1: $" msg2 db 0Dh 0Ah " string2: $“ rev db 0Dh 0Ah "Ergebnis:" $

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

Warum halten Sie das Zeichen Vergleich für die Kopierschleife als Abbruchbedingung zu '31h' kopiert? '31h' repräsentiert das ASCII für die Ziffer' 1'. – lurker

+0

Ich stimme zu schließen, weil ich glaube, dass dies eine Hausaufgabe ist und ich kann nicht sehen, wie OP sich bemüht hat, ihr Problem zu lösen. Vielleicht wurden sie von ihrem [ersten erfolgreichen Versuch einer billigen Lösung] (https://stackoverflow.com/questions/38824670/assembly-reverse-a-string) ermutigt? –

+0

Das ist keine Hausaufgabe, nur ein Hobby, und ich frage hier als letztes Mittel, wenn ich keine Lösung finde. Und wer hat diese Art von Hausaufgaben im Sommer? Diejenigen, die Assembly studieren, tun dies in der Schule während der normalen Schulzeit nicht August. – user3848412

Antwort

0

In Ihrem ersten Code, Sie haben si einstellen zu Beginn der Zeichenfolge Punkt s3 Recht vor Etikett l5: (weil si deutete auf das Ende s3 nach Schleife l4:):

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

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