| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1738 人关注过本帖
标题:编写查找子字符串程序时出了问题
只看楼主 加入收藏
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
结帖率:100%
收藏
 问题点数:0 回复次数:7 
编写查找子字符串程序时出了问题
我的程序如下,麻烦大家帮我看看哪里出错了,如果有更好的方法麻烦给我发一份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
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
我刚学的虽然不大看得懂,但建议LZ,上机试一下,通过编译器来查找程序的问题所在~~~也算是个好办法哦~~
2008-08-28 21:45
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
  看不懂
2008-08-29 02:59
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
今天没事干,看了一下你的程序,发现了几个小问题:
1. edx 没有清0,容易造成比较的结果不正确;
2. 在比较的过程中,比较的是字符,所以没有必要用 edx ,用dl 就可以了;
3. "inc eax  ;每一次edi递增时,eax也递增"这行要去掉!因为,倒数第9行已经有了 inc eax 这行.这行的作用就是统计源串的第一个字符在目标串中的位置.
=========================================================
;我修改了一下,请LZ参考:
===========================
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返回源字符串中第一个字符在目标字符串中的位置   
;否则清除零标志
    xor edx,edx        ;初始化EDX  
    mov edi,target
    mov dl,[edi]      ;判断target是否为空
    cmp dl,0
    jz failed          ;若为空则跳转
    mov eax,0          ;保存位置位eax(可改成 xor eax,eax)
    begin:
        mov esi,source
        mov dl,[esi]
        cmp dl,[edi] ;比较[esi]与[edi]
        jnz L1        ;不相等,则跳转到L1
        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],edx
            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:
        ret

str_find endp
end main
2008-08-29 17:15
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
我得的结果是3 ,因为它是从第0位开始算的.
2008-08-29 17:23
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
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
这个程序还是有BUG:
比如,要比较的两个字符串分别是:ABC 和 12AB3ABC,当完全匹配的时候,目标串也正好到了末尾,最后,程序还是跳到了failed,返回了错误的结果.
所以,还是要修改一下.
2008-09-16 10:55
快速回复:编写查找子字符串程序时出了问题
数据加载中...
 
   



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

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