1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
//CALCUL DU CRC16 OPTIMISE AVEC DE L'ASSEMBLEUR - - - ASM - - - - ASM - - -
lgtrame:=Length(Trame);
W_CRC16:=0;
for k:=1 to trunc(lgtrame/2) do
begin
// Extraction de l'octet de la trame
Octet[1]:=Trame[2*k-1];
Octet[2]:=Trame[2*k-1+1];
asm;
//Récupération dans DX de l'octet à ajouter
xor eax,eax
xor edx,edx
mov al,byte ptr Octet[1]
sub al,48
cmp al,9
jle @c1_0_9
@c1_A_F: sub al,7
@c1_0_9: mov dx,ax
shl edx,4
mov al,byte ptr Octet[2]
sub al,48
cmp al,9
jle @c2_0_9
@c2_A_F: sub al,7
@c2_0_9: add dx,ax
// Calcul du CRC16 avec le nouvel octet
xor ebx,ebx
mov bx, word ptr W_CRC16
xor bx,dx
mov ecx,8
@DO:
mov eax,ebx
shr ebx,1
test eax,1
je @NoXor
xor ebx,40961
@NoXor:
loop @DO
mov word ptr W_CRC16,bx
end;
end;
end;
CRC16:=W_CRC16; |
Partager