String 需要使用masm在80x86汇编语言中连接两个字符串的帮助吗

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 (?)

嗨,我正在用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
当我输入“assembly”和“language”之类的字符串时,没有任何变化。感谢您的帮助。

三个错误:

  • strConcatenation
    的参数是相反的。目前,您正在将
    string1
    连接到
    string2
    的末尾

  • repne scasb
    扫描
    al
    寄存器中尚未初始化的值。要扫描nul,请将其归零:
    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
并不是作为一个特殊情况出现的。当然,它仍然是正确的,只是速度较慢。