嗨,我是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.
这些符号的原因是什么?
答案 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]