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;
[ 本帖最后由 不得闲 于 2008-7-23 23:33 编辑 ]
|