| 
注册时间2005-6-29
阅读权限255
最后登录1970-1-1UID2198 副坛主   
 
 该用户从未签到 | 
 
| 看了一部分 还有些疑惑 一会继续看 
 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
 | 
 |