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

时间:2019-08-28 15:16:57

标签: string assembly visual-c++ x86 inline-assembly

嗨,我是Assembly中的新手,我在练习中遇到了一些问题,要求我在原始字符串中找到一个子字符串,如果找到了,请用另一个给定的字符串替换它。

示例: original string =“此字符串是字符串”;

要查找的字符串=“字符串”

字符串替换=“狗”

输出=“这只狗是只狗”

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);
}

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

  

新字符串:这只狗是只狗╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠dog

代替New string: This dog is a dog.

这些符号的原因是什么?

1 个答案:

答案 0 :(得分:3)

不确定该歧义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]