为什么我的代码在我的字符串后打印重复的垃圾字符?
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]
你好,我是 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]