• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi中使用汇编(关于POS函数的问题)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
在delphi中使用汇编异常的简单,只用使用关键字asm ....end来引导就行了。 
   得到一个字符在字符串中的位置有很多方法,最简单的就是使用delphi自己的Pos函数 
   另外一个方法就是使用 循环查找字符串数组的方法,二分法等,这几种是比较常规的方法,其中建议最好不使用Pos函数。 因为,虽然使用该函数写的代码是很简单,只用一句话   
       CharIndex := Pos(MyChar,str) 
   就能够完成,但是其实他的效率是最低的,因为delphi在使用它之前,先要开辟一个数组空间,然后将长度变成1 
   然后在把这个单字符拷贝到刚刚开辟的内存空间中去。然后才调用Pos函数进行查找,而查找完成之后,Delphi还 
   会 使用 Try...Finally...End机制来释放分配开辟的内存空间,而Try  finally是很消耗资源的。所以不推荐使用。 
   顺序循环查找的方法也很简单,二分法稍微复杂一点。 
  下面是自己写的一个得到一个字符在字符串中的位置函数:(采用的是顺序查找,有兴趣可以在修改一下成为二分查找,其查找速度将会由数量级变成对数级) 

  止在讨论如何在Delphi中使用汇编!

function GetCharPos(ResChar: AnsiChar;Const s: string;Index: integer=0): integer; 
asm
//Test指令执行的就是and与操作,唯一不同的是,不保存结果,所以Edx中的值不变
Test edx,edx; // 判断Edx是否为0,如果为0则指针为 nil
jz @Exit //如果为空, 则跳转退出
Mov Edi,Ecx; //保存Index的值,表示从什么地方开始查找
//使用一个增量计数Edi,可以在循环中使用[Edx+Edi]来得到S的每一个字符
mov ecx, [edx-4]; {得到S字符串的长度 Length(s)(因为在delphi的数据存储中String从1开始计数,那么0用来记录字符串的长度,所以我们移动到前一个地址上则是对应的字符串的长度了),Ecx用来存放字符个数便于使用Loop循环的计数器}
Test Ecx,Ecx; //看字符串 s是否为''没有一个字符,长度为0
Jz @Exit;
cmp ecx,edi //查找开始位置超过字符串长度,退出
Jb @Exit
//Mov edi,0;
@Compore:
cmp al,[edx+edi] //AL中存放字符
jz @Found //相等则说明找到
inc edi; //Edi计数器增加
Loop @Compore //循环比较
@Found:
inc Edi //由于Edi从0计数开始,所以加1
Mov Eax,edi //将查找结果传递给函数 返回结果保存在Eax中
ret
@Exit:
mov Eax,-1;
end;
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap