Delphi中使用汇编(关于POS函数的问题)
2007-11-21 21:48
387 查看
在delphi中使用汇编异常的简单,只用使用关键字asm ....end来引导就行了。
得到一个字符在字符串中的位置有很多方法,最简单的就是使用delphi自己的Pos函数
另外一个方法就是使用 循环查找字符串数组的方法,二分法等,这几种是比较常规的方法,其中建议最好不使用Pos函数。 因为,虽然使用该函数写的代码是很简单,只用一句话
CharIndex := Pos(MyChar,str)
就能够完成,但是其实他的效率是最低的,因为delphi在使用它之前,先要开辟一个数组空间,然后将长度变成1
然后在把这个单字符拷贝到刚刚开辟的内存空间中去。然后才调用Pos函数进行查找,而查找完成之后,Delphi还
会 使用 Try...Finally...End机制来释放分配开辟的内存空间,而Try finally是很消耗资源的。所以不推荐使用。
顺序循环查找的方法也很简单,二分法稍微复杂一点。
下面是自己写的一个得到一个字符在字符串中的位置函数:(采用的是顺序查找,有兴趣可以在修改一下成为二分查找,其查找速度将会由数量级变成对数级)
止在讨论如何在Delphi中使用汇编!
DelphiCode:
得到一个字符在字符串中的位置有很多方法,最简单的就是使用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; |
相关文章推荐
- Delphi中使用汇编(关于POS函数的问题)
- 关于Delphi使用Rewrite()报Invalid FileName错的问题
- delphi与汇编笔记(2)------关于EBP寄存器的说明与使用
- 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
- 关于delphi里面使用QUICK REPORT 打印的种种问题
- 关于在DELPHI中FOR循环语句的使用问题
- 关于delphi在DLL中使用TStyleManager加载皮肤ListView的问题
- 关于Delphi2010使用Indy发送邮件乱码问题的解决
- 关于 Delphi 中流的使用(10): 压缩与解压缩进度 - 回复 "ilst" 的问题
- 关于delphi图片不能使用jpg的问题(涉及自绘会报错)
- 关于DELPHI使用ORACLE回滚段的问题(急)
- delphi与汇编笔记(2)------关于EBP寄存器的说明与使用
- 关于使用汇编所想到的……IT公司企业文化和实力的问题,看看它的技术支持就可见一斑
- delphi与汇编笔记(2)------关于EBP寄存器的说明与使用
- 初次使用xampp MySQL关于端口port占用问题处理
- 关于使用BCB6编写Windows服务的问题
- 关于vue的使用计算属性VS使用计算方法的问题
- 关于HUAWEI EG162G安装使用问题解决方案
- 关于HashMap的putAll(Map m)方法的使用问题
- 关于DAL层使用静态方法,并在WEB层直接调用的问题