连接两个字符串

时间:2020-05-31 19:35:12

标签: assembly x86-16

我需要连接两个字符串,然后在屏幕上显示它。 当我运行该程序时,输出不是我所期望的。 您能告诉我这段代码有什么问题吗?

示例:
预期输入
第一个字符串='my'
第二个字符串='字符串'

预期输出='我的字符串'

assume  ds:date, cs:cod
date segment

    message1 db "Enter the fisrt string $" 
    message2 db 0ah, 0dh , "Enter the second string $"
    message3 db 0ah, 0dh, "The string is $"
    string1 db 20, ?, 20 dup('')
    string2 db 20, ?, 20 dup('')
    string3 db 40 dup('')            

date ends
cod segment
start : 
mov ax, date
mov ds, ax


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

    lea dx, string1
    mov ah, 0ah
    int 21h

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

    lea dx, string2
    mov ah, 0ah
    int 21h

    mov si, 2     ; index of the first element
    mov di, 0     ; final string first element index
    mov cl, string1[1]      ; string lenght
    loopp:
        mov bl, string1[si]
        mov string3[di], bl
        inc si
        inc di
        loop loopp

    mov cl, string2[1]  ; second tring lenght
    mov si, 2   
    loopp2:
        mov bl, string2[si]
        mov string3[di], bl
        inc si
        inc di
        loop loopp
    mov string3[di], '$'

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

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


mov ax, 4c00h
int 21h
cod ends
end start

1 个答案:

答案 0 :(得分:2)

string1 db 20, ?, 20 dup('')
string2 db 20, ?, 20 dup('')
string3 db 40 dup('')

上面的db指令没有必要的缓冲区!在dup括号之间放置的是空字符串。不知道这是否分配任何内存...

这应该有效:

string1 db 20, ?, 20 dup(0)
string2 db 20, ?, 20 dup(0)
string3 db 40 dup(0)

这也是

string1 db 20, ?, 20 dup(' ')   ; ' ' is a space character
string2 db 20, ?, 20 dup(' ')
string3 db 40 dup(' ')

loop指令使用了整个CX寄存器,但是您的代码仅填充了CL部分!
使用这个:

mov cl, string1[1]      ; string lenght
mov ch, 0
...

如果要在 my string 之间使用空格字符,则必须在复制两个字符串之间写入它。