- UID
 - 2198
 
 注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主 
    
 
 
 
该用户从未签到  
 | 
 
看了一部分 还有些疑惑 一会继续看  
 
function CGCompareMem(P1, P2: Pointer; Length: Integer): Integer; assembler;    
asm   
        PUSH    ESI    
        PUSH    EDI    
        PUSH    ECX    
        PUSH    EBX    
        MOV     ESI,P1     ; p1 
        MOV     EDI,P2     ; p2 
        CMP     ESI,EDI    
        JZ      @Equal    
        CMP     ECX,1     
        JL      @NotEqual    
        MOV     edx,ecx     ;  ecx = length   
        shr     edx, 4     
        and     ecx, 15     ;  ??? 汗死 给看成 15h了 
        test    ecx,ecx    
        JZ      @SSECMP2    ;  不足16个字节 跳走 
        mov     eax,-16     ;  EAX 赋初值 
        sub     esi,eax    
        sub     edi,eax    
@CompareLoop:    
        mov     ebx, [ESI + Eax]    
        xor     ebx, [EDI + Eax]    
        jnz     @Mismatch   ; 比较失败 // 没有对小于4个字节的情况 做处理 ? 
        add     Eax, 4   
        js      @CompareLoop  ; 先判断 16 个字节  
        JMP     @SSECMP    
@Mismatch:    
        bsf      ebx, ebx   ; 取第一个非0位 
        shr      ebx, 3   
        sub      eax,-16   
        add      eax,ebx    
        add      eax,1      ; 返回第几个字符不相等 
        JMP      @EXIT     
@SSECMP:    
        sub     esi,16   
        sub     edi,16   
@SSECMP2:    
        TEST    edx,edx    
        JZ      @EXIT    
        mov     eax,ecx    
        neg     edx    
        pxor    xmm2,xmm2  ; 初始化环境 = 0  
@SSECMPLOOP:    
        movups  xmm0,[ESI + Eax]    
        movups  xmm1,[EDI + Eax]    
        pxor    xmm0,  xmm1    
        pcmpeqb  xmm0, xmm2    
        pmovmskb ebx, xmm0    
        CMP     ebx,$FFFF   
        jnz     @SSEMismatch   ; 如果返回值不为 FFFF 则SSE over 
        add     eax,16   
        inc     edx    
        js      @SSECMPLOOP    ;  
        xor     eax,eax    
        JMP     @EXIT    
   
@SSEMismatch:    
        mov     ebx, [ESI + Eax]    
        xor     ebx, [EDI + Eax]    
        jnz     @Mismatch2    
        add     Eax, 4   
        jmp     @SSEMismatch    
@Mismatch2:    
       bsf      ebx, ebx    
       shr      ebx, 3   
       add      eax,ebx    
       add      eax,1   
       JMP     @EXIT    
@NotEqual:    
        MOV     EAX,-1   
        JMP     @EXIT    
@Equal:    
        XOR     EAX,EAX    
@EXIT:    
        POP     EBX    
        POP     ECX    
        POP     EDI    
        POP     ESI    
end |   
 
 
 
 |