| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1741 人关注过本帖
标题:编写查找子字符串程序时出了问题
取消只看楼主 加入收藏
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
结帖率:100%
收藏
 问题点数:0 回复次数:2 
编写查找子字符串程序时出了问题
我的程序如下,麻烦大家帮我看看哪里出错了,如果有更好的方法麻烦给我发一份446794753@
程序代码:
TITLE str_find.asm
;程序描述:查找子字符串
;创建日期:2008\8\25

INCLUDE Irvine32.inc ;这是我看的书的作者的头文件,用到了他的一个函数:writedec,其要显示的数保存在EAX在中

str_find proto,                                 ;
    source:ptr byte,          ;the begining position to remove  ;
    target:ptr byte            ;the number to remove    
.data
t byte "123ABC342432",0
s byte "ABC",0
.code
main proc
    
    invoke str_find,addr s,addr t
    call writedec   ;显示保存在EAX中的位置
    call crlf
    ret

main endp

str_find proc ,
    source:ptr byte,
    target:ptr byte
;查找源字符串是否在目标字符串中
;结果:若存在则设置零标志,eax返回源字符串中第一个字符在目标字符串中的位置    
;否则清除零标志    
    mov edi,target
    mov edx,[edi]      ;判断target是否为空
    cmp edx,0
    jz failed          ;若为空则跳转
    mov eax,0          ;保存位置位eax
    begin:
        mov esi,source
        mov edx,[esi] 
        cmp edx,[edi] ;比较[esi]与[edi]
        jnz L1        ;不相等,则跳转到L1
        L2:           ;否则比较它们的下一个字符
            inc edi  
            mov edx,[edi]
            cmp edx,0    ;判断目标字符串是否移到了末尾
            jz failed 
            inc eax      ;每一次edi递增时,eax也递增
            inc esi
            mov edx,[esi]
            cmp edx,0    ;若源字符串移到了末尾,标志着已找到了
            jz successful;成功退出即可
            
            cmp [edi],edx
            je L2
        L1:
            inc edi      ;转入比较目标字符串的下一个字符
            mov edx,[edi]
            cmp edx,0
            jz failed 
            inc eax
            jmp begin
    failed:
         mov dx,1
         or dx,1    ;这是为了清楚零标志    
    successful:
        ret

str_find endp
end main
搜索更多相关主题的帖子: 字符 编写 
2008-08-28 20:35
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
收藏
得分:0 
很感谢ONEPROBLEM帮我认真修改程序,
看了你给我提的几个问题,恍然大悟啊
2008-08-30 18:09
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
收藏
得分:0 
我回去后又仔细看了看,有点我们都忽略了,如果目标字符串为"12AB3ABC456",
而源字符串为"ABC",在AB与源字符串"ABC"做匹配时,我们要递增EAX,但在做后面的ABC与源字符串"ABC"做匹配时,又不需要递增,所以解决的办法是保存在做匹配前的
EAX。程序如下:
TITLE str_find.asm
;程序描述:查找子字符串
;作者:dizengrong
;创建日期:2008\8\25
;版本:1.0

INCLUDE Irvine32.inc

str_find proto,                                 ;
        source:ptr BYTE ,          ;the begining position to remove  ;
        targe:ptr BYTE             ;the number to remove   
.data
t BYTE  "12AB3ABC342432",0
s BYTE  "ABC",0
.code
main proc
        
        invoke str_find,addr s,addr t
        jnz quit
        call writedec
        call crlf
        quit:
        ret

main endp

str_find proc uses edx ecx esi edi,
        source:ptr BYTE ,
        Targe:ptr BYTE
;查找源字符串是否在目标字符串中
;结果:若存在则设置零标志,eax返回源字符串中第一个字符在目标字符串中的位置        
;否则清除零标志        
        mov edi,targe
        mov edx,[edi]      ;判断target是否为空
        cmp edx,0
        jz failed          ;若为空则跳转
        mov eax,0          ;保存位置位eax
        begin:
                mov esi,source
                mov dl,[esi]
                cmp dl,[edi] ;比较[esi]与[edi]
                jnz L1        ;不相等,则跳转到L1
                                           ;修改的地方:
                mov ecx,eax   ;如果找到匹配的,则保存开始的位置,即返回值
                L2:;否则比较它们的下一个字符
                        
                        inc edi  
                        mov dl,[edi]
                        cmp dl,0    ;判断目标字符串是否移到了末尾
                        jz failed
                        inc eax      ;每一次edi递增时,eax也递增
                        inc esi
                        mov dl,[esi]
                        cmp dl,0    ;若源字符串移到了末尾,标志着已找到了
                        jz successful;成功退出即可
                        
                        cmp [edi],dl
                        je L2
                L1:
                        inc edi      ;转入比较目标字符串的下一个字符
                        mov dl,[edi]
                        cmp dl,0
                        jz failed
                        inc eax
                        jmp begin
        failed:
                 mov dx,1
                 or dx,1               
        successful:
                        mov eax,ecx  ;修改的地方:
                ret

str_find endp
end main
2008-08-31 19:52
快速回复:编写查找子字符串程序时出了问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040889 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved