• Delphi SysUtils-CompareText 和 AnsiCompareText 比较两个字符串的大小


    Delphi SysUtils-CompareText 和 AnsiCompareText

    1、CompareText

    两个字符串对象进行比较,忽略大小写,两个字符串缓冲区地址利用EAX和EDX两个寄存器传给该函数,字符串的长度用4个字节保存在缓冲区的前面,函数用EAX返回比较结果,结果为0表示相同。

    函数原型:

    function CompareText(const S1, S2: string): Integer; assembler;
    asm
            PUSH    ESI ; //保存寄存器 
            PUSH    EDI 
            PUSH    EBX 
            MOV    ESI,EAX ; //EAX、EDX的值给ESI、EDI 
            MOV    EDI,EDX 
            OR      EAX,EAX ; //如果EAX不为0,则将EAX-4地址中的值给EAX 
            JE      @@0 
            MOV    EAX,[EAX-4] 
    @@0:    OR      EDX,EDX ; //如果EDX不为0,则将EDX-4地址中的值给EDX 
            JE      @@1 
            MOV    EDX,[EDX-4] 
    @@1:    MOV    ECX,EAX ; //将EAX的值给ECX 
            CMP    ECX,EDX ; //将EAX和EDX中较小者给ECX(无符号数) 
            JBE    @@2 
            MOV    ECX,EDX 
    @@2:    CMP    ECX,ECX 
    @@3:    REPE    CMPSB ; //按字节比较ESI、EDI指向的内存中的数据,比较的字节数为ECX,遇到不同的数据则停止比较 
            JE      @@6 ; //如果两者相同则跳转到@@6标号处 
            MOV    BL,BYTE PTR [ESI-1] ; //取不同数据其中的一个给BL 
            CMP    BL,'a' ; //如果BL是将小写字母则转换为大写字母 
            JB      @@4 
            CMP    BL,'z' 
            JA      @@4 
            SUB    BL,20H 
    @@4:    MOV    BH,BYTE PTR [EDI-1] ; //取不同数据中的另一个给BH 
            CMP    BH,'a' ; //如果BH是将小写字母则转换为大写字母 
            JB      @@5 
            CMP    BH,'z' 
            JA      @@5 
            SUB    BH,20H 
    @@5:    CMP    BL,BH ; //如果BL与BH相同则继续前面的比较 
            JE      @@3 
            MOVZX  EAX,BL ; //将BL、BH的值给EAX、EDX 
            MOVZX  EDX,BH 
    @@6:    SUB    EAX,EDX ; //用EAX减去EDX 
            POP    EBX ; //恢复寄存器 
            POP    EDI 
            POP    ESI
    end;
    

    返回值:

    • -1   [ 当 S1<S2 时 ] 
    •  0   [ 当 S1=S2  时 ] 
    •  1   [ 当 S1>S2  时 ]

    注意:不区分大小写;两个字符串的字符依次从左至右逐一比较,大小取决于字符在ASCII表中的序号,序号大的对应的字符为大。

      

    2、AnsiCompareText  

    函数原型:

    function AnsiCompareText(const S1, S2: string): Integer;
    begin
    {$IFDEF MSWINDOWS}
      Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
        Length(S1), PChar(S2), Length(S2)) - 2;
    {$ENDIF}
    {$IFDEF LINUX}
      Result := WideCompareText(S1, S2);
    {$ENDIF}
    end;
    

      

    创建时间:2020.08.27  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    电商拼团系统开发思路和拼团系统开发产品设计思路
    唐古拉优选拼团系统设计模式和唐古拉优选拼团系统核心代码介绍
    计算机体系结构之三--函数的调用和返回【译】
    cxv文件合并
    ubuntu18.04安装Mono及MonoDevelop,用c#开发winform
    repo怎么都下不完,原因
    repo下载安卓源码经常掉线,解决方法
    编译ad10
    ub18.04 root账户
    安卓源码导入android studio
  • 原文地址:https://www.cnblogs.com/guorongtao/p/13569790.html
Copyright © 2020-2023  润新知