这段代码是将两个字符串对象进行比较,忽略大小写,两个字符串缓冲区地址利用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
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;