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

Delphi SysUtils-CompareText 和 AnsiCompareText

1、CompareText

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

函数原型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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  

函数原型:

1
2
3
4
5
6
7
8
9
10
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  更新时间:

 

posted on   滔Roy  阅读(876)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
历史上的今天:
2019-08-27 (一)CGI (通用网关接口) 简介

导航

点击右上角即可分享
微信分享提示