String 需要使用masm在80x86汇编语言中连接两个字符串的帮助吗
嗨,我正在用80x86汇编语言编写一个程序,使用masm连接两个字符串。我试图做的是找到第一个字符串的结尾,然后将第二个字符串的内容添加到第一个字符串上。以下是我目前掌握的代码:String 需要使用masm在80x86汇编语言中连接两个字符串的帮助吗,string,assembly,x86,masm,String,Assembly,X86,Masm,嗨,我正在用80x86汇编语言编写一个程序,使用masm连接两个字符串。我试图做的是找到第一个字符串的结尾,然后将第二个字符串的内容添加到第一个字符串上。以下是我目前掌握的代码: .586 .MODEL FLAT .STACK 4096 INCLUDE io.h .DATA prompt BYTE "Input String", 0 string1 BYTE 80 DUP (?) string2 BYTE 80 DUP (?)
.586
.MODEL FLAT
.STACK 4096
INCLUDE io.h
.DATA
prompt BYTE "Input String", 0
string1 BYTE 80 DUP (?)
string2 BYTE 80 DUP (?)
displayLbl BYTE "Concatenated string", 0
.CODE
_MainProc PROC
input prompt, string1, 80 ; ask for first string
input prompt, string2, 80 ; repeat for second string
lea eax, string1
push eax
lea ebx, string2
push ebx
call strConcatenation ; procedure to concatenate the strings
add esp, 8 ; remove parameters
output displayLbl, string1 ; display result
mov eax, 0 ; exit with return code 0
ret
_MainProc ENDP
strConcatenation PROC
push ebp
mov ebp, esp
push edi
push esi
pushfd
mov edi, [ebp+8]
repnz scasb ; scan for null in string1
mov esi, [ebp+12]
dec edi
cld
whileConcStr:
cmp BYTE PTR [esi], 0 ; null source byte?
je endWhile ; stop copying if null
lodsb ; load data
stosb ; store data
jmp whileConcStr ; go check next byte
endWhile:
mov BYTE PTR [edi], 0 ; terminate destination string
popfd ; restore flags
pop esi ; restore registers
pop edi
pop ebp
ret
strConcatenation ENDP
END
当我输入“assembly”和“language”之类的字符串时,没有任何变化。感谢您的帮助。三个错误:
的参数是相反的。目前,您正在将strConcatenation
连接到string1
的末尾string2
扫描repne scasb
寄存器中尚未初始化的值。要扫描nul,请将其归零:al
xor al,al
在找到repne scasb
中的字节或al
达到零时终止(每次迭代时递减)。您也没有初始化ecx。要无限期扫描直到找到字节,可以将ecx
设置为ecx
-1
repnz
将在每次迭代中递减ecx
,如果它变为零,则终止,这是您不想要的。因此,您可以在开始之前将ecx
设置为-1
,基本上要求最多2^32次重复。因此,我尝试将ecx设置为-1,我会得到一个错误或相同的结果,我认为您将strconcatation
的参数颠倒了。目前,它将把string1
连接到string2
的末尾,听起来好像你想换个方向。尝试反转它们仍然不起作用,很可能问题出在我的过程中。哦,你必须在repne scasb
之前将al
归零。否则,您将搜索某个随机值,而不是零。通过这些修复,函数适用于me.BTW,xor eax,eax
是将AL归零的更有效方法,将整个寄存器归零,而不是将零合并到旧内容的低字节中。在现代CPU上,xor al,al
并不是作为一个特殊情况出现的。当然,它仍然是正确的,只是速度较慢。