为什么我的代码在我的字符串后打印重复的垃圾字符?

Why does my code print a repeated garbage character after my string?

你好,我是 Assembly 的新手,我在练习中遇到了一些问题,要求我在原始字符串中找到一个子字符串,如果找到,则将其替换为另一个给定的字符串。

示例: 原始字符串 = "This string is a string";

要查找的字符串 = "string"

字符串替换 = "dog"

输出=“这条狗是狗”

void main()
{
    //Input

    char stringa[1024] = "This string is a string";

    char str1[] = "string"; // string to find

    char str2[] = "dog";    // string to replace

    // Output
    char risultato[1024]; 

    __asm
    {   

        LEA EDI, stringa
        MOV EAX, EDI             //EAX like 'i' in stringa
        LEA EDI, risultato
        MOV ECX, EDI         //ECX like 'j' in risultato

        //finding str1 in stringa
        MOV EDI, EAX
        LEA ESI, str1

 search:

        MOV BL, [ESI]       //current char of str1

        //if i'm at the end of str1 

                //mean that str1 is in stringa
        CMP BL, 0
        JZ found

        CMP[EDI], 0  //check if end of stringa
        JZ fine
        //otherwise
        CMP[EDI], BL
        JNE notfound
        INC EDI
        INC ESI
        JMP search


found:

        MOV EAX, EDI

        DEC EAX

        LEA ESI, str2   //sostitution of str1 with str2


sostituisci:

        MOV BL, [ESI]   //current char of str2

        CMP BL, 0   //checj the end of str2

        JZ continua

        //otherwise

        MOV EDI, ECX

        MOV [EDI], BL   //str2 paste in risultato
        INC ECX
        INC ESI
        JMP sostituisci //next position in str2

notfound:

        MOV EDI, EAX
        MOV ESI, ECX
        MOV BL, [EDI]
        MOV [ESI], BL
        INC ECX

continua:

        LEA ESI, str1
        INC EAX
        MOV EDI, EAX
        CMP [EDI], 0
        JNE search

fine:




    }

    // output
    printf("New string: %s\n", risultato);
}

我不明白为什么我的代码不能正常工作。 输出为:

New string: This dog is a dog╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠dog

而不是New string: This dog is a dog.

这些符号的原因是什么?

不确定您的汇编程序为这个不明确的 CMP [EDI], 0 编码了什么。确保它是一个字节大小的操作。也许你需要写类似 cmp byte ptr [edi], 0.

的东西

虽然您的程序有一个混乱的流程,但它会做它需要做的事情,除了在结果文本的末尾放置一个零终止符。

只需添加这一条指令:

fine:
    mov byte ptr [ecx], 0

请注意,您可以使用任何通用寄存器来寻址内存,就像我使用的 [ecx]

1.

    LEA EDI, stringa
    MOV EAX, EDI         //EAX like 'i' in stringa
    LEA EDI, risultato
    MOV ECX, EDI         //ECX like 'j' in risultato

变为:

    LEA EAX, stringa     //EAX like 'i' in stringa
    LEA ECX, risultato   //ECX like 'j' in risultato

2.

    MOV EDI, ECX
    MOV [EDI], BL   //str2 paste in risultato
    INC ECX

变为:

    MOV [ECX], BL   //str2 paste in risultato
    INC ECX

3.

notfound:
    MOV EDI, EAX
    MOV ESI, ECX
    MOV BL, [EDI]
    MOV [ESI], BL

变为:

notfound:
    MOV BL, [EAX]
    MOV [ECX], BL

LEA 指令可以为您做一些运算:

    MOV EAX, EDI
    DEC EAX

变为:

    LEA EAX, [EDI-1]