CnPack Forum » 技术板块灌水区 » Delphi汇编学习5(从右边开始查找某个子串的位置)


2008-7-23 23:28 不得闲
Delphi汇编学习5(从右边开始查找某个子串的位置)

从一个字符串的右边开始查找子字符串出现的位置,里面代有详细的注释,希望有能者,能搞出一个效率更高的算法出来
我这个只是用汇编实现了,并未考虑到算法
如:
RightPos('不得闲','123不得闲24不得闲')  
返回结果12既最后一个‘不得闲’ 出现的位置

{*************************************************************}
{*    名称: RightPos                                       *}
{*    功能: 在str串中从右边开始查找SubStr第一次出现的位置   *}
{*    作者: 不得闲                                          *}
{*    时间: 2008-07-23                                      *}
{*************************************************************}
function RightPos(Const SubStr,Str: string): integer;
asm
     push ebx
     push esi
     push edi
     mov  esi,[eax-4] //substr长度
     mov  edi,[edx-4] //str长度
     cmp  esi,edi //比较两个的长度
     ja   @@Exit  //大于退出
     mov  ecx,edi
     sub  ecx,esi      
     mov  edi,0
     push esi   //保存子字符串的长度
   @@DoFind:
     mov  ebx,ecx     
     add  ebx,edi
     mov  bl,byte ptr[edx+ebx] //str字符串的倒数Length(SubStr)字符开始
     mov  bh,byte ptr[eax+edi] //SubStr的第一个字符开始循环
     cmp  bl,bh
     jnz  @@Next //如果不相等,则进行下一个操作,将主字符串指针前移一个
     dec  esi    //否则继续向下比较
     jz   @@Ret
     inc  edi
     jmp  @@DoFind

   @@Next:
     Pop  esi  //还原子串长度,进行下一个操作
     dec  ecx
     mov  edi,0
     push esi //保存子串长度
     jmp  @@DoFind //移动主串指针后,继续查找
   @@Ret:
     pop  esi
     inc  ecx
     mov  eax,ecx
     jmp  @@Pop
   @@Exit:
     mov  eax,0
   @@Pop:
     Pop  edi
     pop  esi
     pop  ebx
end;

[[i] 本帖最后由 不得闲 于 2008-7-23 23:33 编辑 [/i]]

2008-7-24 22:00 lixupeng
看看:victory:

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.