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 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 (通用网关接口) 简介