- 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 |
|