![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
两个字符串对象进行比较,忽略大小写,两个字符串缓冲区地址利用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;