2016-08-08 5 views
1

Я хочу объединить две строки, но в моем представлении вместо получения окончательной конкатенированной строки я получаю строку странных символов и пробелов, может быть, кто-то может мне немного помочь. Я хочу сохранить результат в s3. Вот кодassembly concatenate две строки

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 

Я нашел решение, надеюсь, что это хороший один без каких-либо ошибок: сегмента данных тзда дб 0DH, 0AH «строки1: $» msg2 дб 0DH, 0AH " String2: $» оборотов дб 0DH, 0AH, "Результат: $"

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

Почему вы продолжаете сравнивать символ, который будет скопирован в '31h' как условие завершения для цикла копирования? '31h' представляет ASCII для цифры' 1'. – lurker

+0

Я голосую, чтобы закрыть, потому что я считаю, что это домашнее задание, и я не вижу, как ОП приложил все усилия для решения их проблемы. Может быть, их поощряла их [первая успешная попытка дешевого решения] (https://stackoverflow.com/questions/38824670/assembly-reverse-a-string)? –

+0

Это не домашнее задание, просто хобби, и я прошу здесь, как последнее средство, когда я не нахожу решение. И у кого есть такая домашняя работа летом? Те, кто изучают сборку, делают это в колледже в обычное школьное время, а не в августе. – user3848412

ответ

0

в своем первом коде, вы должны установить si, чтобы указать на начало строки s3 перед ярлыком l5: (потому чтоуказывал на конец s3 после цикла l4:):

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^