首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的代码会在字符串之后打印一个重复的垃圾字符?

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

Stack Overflow用户
提问于 2019-08-28 15:16:57
回答 1查看 98关注 0票数 4

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

示例:原始字符串=“此字符串是字符串”;

查找字符串= " string“

字符串替换=“狗”

Output =“这只狗是一只狗”

代码语言:javascript
复制
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╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠dog

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

这些符号的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-30 15:27:03

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

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

只需添加以下一条指令:

代码语言:javascript
复制
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

变成:

代码语言:javascript
复制
    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

变成:

代码语言:javascript
复制
    MOV [ECX], BL   //str2 paste in risultato
    INC ECX

3.

注意事项: MOV EDI,EAX MOV ESI,ECX MOV BL,EDI MOV ESI,BL

变成:

代码语言:javascript
复制
notfound:
    MOV BL, [EAX]
    MOV [ECX], BL

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

MOV EAX, EDI DEC EAX

变成:

代码语言:javascript
复制
    LEA EAX, [EDI-1]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57695579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档