首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

32汇编运作得到正确结果,程序结束的时候又执行一次

2012-12-27 
32汇编运行得到正确结果,程序结束的时候又执行一次?.datastr1 db ABCDEFG,0str2 db EFG,0info db not

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
[其他解释]
是不是把str_find过程写在main的后面 在main执行完 又执行到str_find过程里了? 
[其他解释]
call WaitMsg 之后没有ret吗?直接指令流跑偏鸟
[其他解释]
main 方法完还要ret吗? 不是直接执行到文件末尾 end main 吗?
[其他解释]

引用:
call WaitMsg 之后没有ret吗?直接指令流跑偏鸟

main 方法完还要ret吗? 不是直接执行到文件末尾 end main 吗?
[其他解释]
你以为是高级语言啊?
[其他解释]
引用:
你以为是高级语言啊?

我说一下程序框架哦 :

main PROC
invoke str_find
ret   ; 这里要加ret吗?
main ENDP

str_find PROC
ret
str_find ENDP

end main
[其他解释]
引用:
对!或者你要执行结束进程动作比如ExitProcess

invoke StdIn,addr buffer,sizeof buffer


invoke ExitProcess,0
有这个了呀   那就不要ret了吧

热点排行