【发布时间】:2020-11-23 04:37:01
【问题描述】:
您好,我用 80x86 汇编语言编写了一个程序,它使用连接两个字符串的 masm。我正在尝试做的是找到第一个字符串的末尾在哪里,然后将第二个字符串的内容添加到第一个字符串上。这是我到目前为止的代码:
.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
当我输入诸如“程序集”和“语言”之类的字符串时,没有任何变化。任何帮助表示赞赏,谢谢。
【问题讨论】:
-
一条评论是
repnz将在每次迭代中递减ecx并在它变为零时终止,这是您不想要的。因此,您可以在开始之前将ecx设置为-1,实际上要求最多重复2^32 次。 -
所以我尝试将 ecx 设置为 -1,我会得到一个错误或相同的结果
-
我认为您对
strConcatenation的论点颠倒了。就目前而言,它将string1连接到string2的末尾,听起来你想要它反过来。 -
尝试扭转它们仍然不起作用很可能问题出在我的程序中
-
哦,您必须在
repne scasb之前清零al。否则,您正在搜索一些随机值而不是零。通过这些修复,该功能对我有用。