在汇编中连接两个字符串

Concatenate two strings in assembly

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

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

预期输出 = 'my string'

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
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
...

如果你想在 mystring 之间使用一个分隔的 space 字符,你必须将它写在两者之间复制两个字符串。