请汇编高手注释的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;




本文转自 byteh 51CTO博客,原文链接:http://blog.51cto.com/byteh/84515,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值