飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3070|回复: 1

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

[复制链接]
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-5-1 23:35:18 | 显示全部楼层 |阅读模式
    好不容易注册进了。呵呵,把我以前写的一点东西也同样转过来。希望对Delphi中使用汇编的人能够有帮助。
       原文请参看我的博客:
       http://blog.csdn.net/suiyunonghen/archive/2007/11/21/1897062.aspx
       在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;

    [ 本帖最后由 suiyunonghen 于 2008-5-4 19:41 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-6-9 16:20
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2008-6-18 08:18:01 | 显示全部楼层
    不错。支持下
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表