String 替换部件中的字符串

String 替换部件中的字符串,string,assembly,String,Assembly,我想得到一个源字符串,在其中找到一个键,并用替换字符串替换该键,因此我复制源的剩余部分,以及结果中的替换字符串 当源字符串中不存在键时,它会输出正确的提示:“该键未出现在字符串中。” 但是当源包含键时,它会阻塞,无法继续运行 (看起来找到的标签部分中的某物已丢失并溢出) 是否有人可以帮助更正找到的零件 任何帮助都将不胜感激:) ;用于搜索嵌入在另一个字符串中的一个字符串的程序 ; 作者:R.Detmer修订日期:1997年10月 .386 .样板房 ExitProcess原型NEAR32 std

我想得到一个字符串,在其中找到一个,并用替换字符串替换该键,因此我复制源的剩余部分,以及结果中的替换字符串
当源字符串中不存在键时,它会输出正确的提示:“该键未出现在字符串中。”
但是当包含时,它会阻塞,无法继续运行 (看起来找到的标签部分中的某物已丢失并溢出)
是否有人可以帮助更正找到的零件

任何帮助都将不胜感激:)

;用于搜索嵌入在另一个字符串中的一个字符串的程序
; 作者:R.Detmer修订日期:1997年10月
.386
.样板房
ExitProcess原型NEAR32 stdcall,dwExitCode:DWORD
包括io.h
cr-eq-0dh;回车符
Lf eq 0ah;换行字符
.堆栈4096;保留4096字节堆栈
.数据
prompt1字节“要搜索的字符串?”,0
prompt2字节cr,Lf,“要搜索的密钥?”,0
prompt3字节cr,Lf,“要替换的字?”,0
源字节100重复(?)
密钥字节20重复(?)
替换字节20重复(?)
德沃德?
键长德沃德?
回答:德沃德?
开始长德沃德?
德沃德?
长德沃德?
拉斯波森·德沃德?
德沃德?
第一夫人德沃德?
德沃德夫人?
关键位置德沃德?
失败字节cr,Lf,Lf,“键未出现在字符串中。”,cr,Lf,0
成功字节cr,Lf,Lf,“结果字符串为:”,cr,Lf,Lf
结果字节200重复(?)
公共启动;公开入口点
.代码
_启动:输出提示1;索要
输入源,100;和输入源字符串
lea eax,来源;查找字符串的长度
推动eax;长度参数
打电话给斯特伦
mov src长度,eax;保存源的长度
输出提示2;索要
输入键,20;和输入键字符串
leaeax,key;查找字符串的长度
推动eax;长度参数
打电话给斯特伦
mov键长,eax;保存密钥的长度
输出提示3;索要
输入替换,20;并输入替换字符串
lea eax,更换;查找字符串的长度
推动eax;长度参数
打电话给斯特伦
dec eax
mov-repLength,eax;节省更换时间
; 计算要检查的源的最后位置
mov-eax,src-length
子eax,密钥长度
公司eax;SRC长度− keyLength+1
mov lastPosn,eax
cld;从左到右比较
mov-eax,1;起始位置
whilePosn:cmp eax,lastPosn;位置
您忘记了零终止成功消息。
它将中断最后一次宏调用
输出成功
,因此程序似乎没有正确替换字符串

found:      
  mov    keyPosition, eax  ; position of key
  mov    ebx, eax         ;copy start position of key
  lea    eax, source
  sub    ebx, eax          ;position - source address 
  mov    BeginLength, ebx  ;begin Source length (before key)
在这些行中,你减去了无法减去的东西


当您找到标签时,EAX有一个基于1的相对位置索引,您可以将其复制到EBX寄存器中。该值的范围为1到100。现在减去源缓冲区的绝对地址。这可能有数百万美元。这显然是个错误。当您以后将其用作循环计数器并开始损坏内存时,它将变得非常糟糕

因为结果字符串以null结尾,所以它没有错,我在DETMER(第234页)的“80X86汇编语言简介”中检查了它。tnx@Fifoerniki的意思是这部分:mov BYTE PTR[edi],0;终止存储到内存中的目标字符串,然后重新加载大量内容。e、 g.在
loopReplace
之后,您在
eax
中计算3个不同的内容并存储它们,然后立即将它们加载回不同的寄存器。如果你只是在寄存器中计算你想要的东西,你会节省很多指令。e、 g.
moveESI,[firstParam]
/
添加esi,[repLength]
。还要注意的是,
rep movsb
movsb
/
循环
更有效
movsb
/
循环
就像是故意的反优化;这是复制字节的最慢方式,而不是在内存中保留循环计数器。无论如何,关键是,将变量保留在寄存器中可以使代码更短。使用注释跟踪每个步骤中哪个寄存器正在做什么。最终的结果更具可读性,IMO.tnx@PeterCordes好吧,你是对的。我正在努力使代码更具可读性,我将使用注释代替r right@user3144770我编辑了它,但仍然Stuck你可以查看它吗?
success     BYTE   cr,Lf,Lf, " The result string is : " ,cr,Lf,Lf
found:      
  mov    keyPosition, eax  ; position of key
  mov    ebx, eax         ;copy start position of key
  lea    eax, source
  sub    ebx, eax          ;position - source address 
  mov    BeginLength, ebx  ;begin Source length (before key)