当前位置: 代码迷 >> 汇编语言 >> 32汇编运行得到正确结果,程序结束的时候又执行一次?该怎么解决
  详细解决方案

32汇编运行得到正确结果,程序结束的时候又执行一次?该怎么解决

热度:3075   发布时间:2013-02-26 00:00:00.0
32汇编运行得到正确结果,程序结束的时候又执行一次?
.data
str1 db 'ABCDEFG',0
str2 db 'EFG',0
info db 'not found!',0
.data?
buffer db 100 dup(?)
.CODE
START:
str_find PROTO,
str1:PTR BYTE,
str2:PTR BYTE


main PROC;;;;;;;;;;;;;;;;;;;;;;

INVOKE str_find,ADDR str1,ADDR str2

call WaitMsg

main ENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;

str_find PROC,;;;;;;;;;;;;;;;;;;;;
str3:PTR BYTE,
str4:PTR BYTE

mov esi,str3
mov edi,str4
xor edx,edx ;edx为计数器 清零

INVOKE Str_length,str4 ;子串长度
mov ebx,eax

s:
cmp BYTE PTR [esi],0            ;字符为0
jz endstr ;字符串结尾
mov al,[esi]
cmp al,[edi];比较字符
jne nequals ;字符不匹配

inc edx  ;找到一个字符 计数器+1
cmp edx,ebx
jz ok ;找到全部的字符
inc esi ;
inc edi ;指向下一字符
jmp t ;下一次循环
nequals:
XOR edx,edx ;字符不匹配,计数器清零 
mov edi,str4 ;从头匹配子串
inc esi ;匹配下一个母串字符
t:
jmp s

endstr:
mov edx,offset info ;字符串结尾,没找到子串
call WriteString ;"not found!"
call Crlf
jmp return ;返回


ok:
sub esi,str3 ;esi是最后一个匹配字符的地址 减母串地址  等于在母串的索引
sub esi,ebx ;子串末字符的索引 减子子串长度
inc esi        ;因为索引从0开始 所以+1  最后等于子串首字符的索引
mov eax,esi
call WriteDec
call Crlf
return:
ret
str_find ENDP;;;;;;;;;;;;;;;;;;;;;;

;暂停显示,回车键关闭
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0

end START
程序的结果是 找到子串则打印子串所在的索引,没找到则打印"not found!"
但是 无论是哪个结果  在按任意键退出退出的那一瞬间又打印了一次"not found!"  为什么??
我才学32汇编一个星期 请大神们教我下啊
------解决方案--------------------------------------------------------
对!或者你要执行结束进程动作比如ExitProcess
  相关解决方案