zoukankan      html  css  js  c++  java
  • Delphi中使用汇编(关于POS函数的问题)

    在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;
     
  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/DxSoft/p/Delphi_Asm_Study.html
Copyright © 2011-2022 走看看