在汇编中连接两个字符串
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
...
如果你想在 my 和 string 之间使用一个分隔的 space 字符,你必须将它写在两者之间复制两个字符串。
我需要连接两个字符串然后在屏幕上显示。 当我 运行 这个程序的输出不是我所期望的。 你能告诉我这段代码有什么问题吗?
示例:
预期输入
第一个字符串 = '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
...
如果你想在 my 和 string 之间使用一个分隔的 space 字符,你必须将它写在两者之间复制两个字符串。