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

来源:互联网 发布:批量处理图片的软件 编辑:程序博客网 时间:2024/05/17 01:35

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

DelphiCode:
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; 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 部落有可疑记录被暂时禁封怎么办 鼻子通向嘴那里痒得难受怎么办 小孩上嘴唇中间的连线碰掉了怎么办 秋田犬夏天退毛严重么 怎么办 初中数学基本没学过高中怎么办 老师家纺突然想日语文老师怎么办 微信聊天表情小企鹅不动了怎么办 微信自带小表情不全怎么办 爱奇艺电视果有图像无声音怎么办 微信表情包保存不到手机相册怎么办 才出生的兔宝宝被母兔抓伤了怎么办 老婆生气了说恨我一辈子我该怎么办 华为手机微信表情不显示含义怎么办 地下城游戏登录链接一直失败怎么办 聊天时别人打听家人不想回答怎么办 微信钱包零钱密码忘了怎么办 斗图我能怎么办我也很无奈 微信解冻设备不一致申诉失败怎么办 看不懂微信脸部表情什么意思怎么办 有的动图图片过大微信发不了怎么办 微信漂流瓶扔瓶子没有人回复怎么办 删了微信 手贱 添加 怎么办 姨妈弄到床垫上拆不下来洗怎么办 碰到情商智商都高的小人怎么办 微信聊天界面右上角的小人头怎么办 最近摸高摸到的高度越来越矮怎么办 每次孕检显示小孩子体型大怎么办? 阴阳师纸片人蓝色锦囊点掉了怎么办 抱孩子把腰闪了动不了在家怎么办 餐厅客人中有儿童服务时怎么办 脊柱胸段向右侧凸要怎么办 玩球球大作战不小心开自由了怎么办 小孩哭脸后喝水呛着了怎么办 摔跤引起的脸部半边儿僵硬怎么办 老人受了刺激大笑不止是怎么办 想让父母陪着玩 没时间怎么办 开过光的百家锁东西别人碰了怎么办 兔兔助手描述文件变了存档怎么办 扣扣没有绑手机被盗了怎么办 我的扣扣被盗了好友也被删了怎么办 小孩不胖但脖子黑怎么办呢