嗨,我是程序集的新手,我在一个练习中遇到了一些问题,要求我在一个原始字符串中找到一个子字符串,如果找到了,就用另一个给定的字符串替换它。
示例:原始字符串=“此字符串是字符串”;
查找字符串= " string“
字符串替换=“狗”
Output =“这只狗是一只狗”
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.
这些符号的原因是什么?
发布于 2019-08-30 15:27:03
不确定您的汇编程序为这个模糊的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 risultato2.
MOV EDI, ECX MOV [EDI], BL //str2 paste in risultato INC ECX
变成:
MOV [ECX], BL //str2 paste in risultato
INC ECX3.
注意事项: MOV EDI,EAX MOV ESI,ECX MOV BL,EDI MOV ESI,BL
变成:
notfound:
MOV BL, [EAX]
MOV [ECX], BLLEA指令可以为您做一些算术:
MOV EAX, EDI DEC EAX
变成:
LEA EAX, [EDI-1]https://stackoverflow.com/questions/57695579
复制相似问题