需要帮助使用 masm 以 80x86 汇编语言连接两个字符串
Posted
技术标签:
【中文标题】需要帮助使用 masm 以 80x86 汇编语言连接两个字符串【英文标题】:Need help concatenating two strings in 80x86 assembly language using masm 【发布时间】: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
。否则,您正在搜索一些随机值而不是零。通过这些修复,该功能对我有用。
【参考方案1】:
三个错误:
你对strConcatenation
的论点被颠倒了。就目前而言,您将string1
连接到string2
的末尾。
repne scasb
扫描al
寄存器中的值,该值尚未初始化。要扫描 nul,请将其归零:xor al, al
。
repne scasb
在找到al
中的字节或ecx
达到零时终止(每次迭代递减)。你也没有初始化ecx
。要无限期扫描直到找到字节,您可以将ecx
设置为-1
。
【讨论】:
顺便说一句,xor eax,eax
是一种更有效的归零 AL 的方法,将整个寄存器归零,而不是将零合并到旧内容的低字节中。在现代 CPU 上,xor al,al
并非特例为 dependency-breaking zeroing idiom。当然,它仍然是正确的,只是更慢。以上是关于需要帮助使用 masm 以 80x86 汇编语言连接两个字符串的主要内容,如果未能解决你的问题,请参考以下文章