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 更新时间: