CRC全称循环冗余校验,做数据传输时,经常用到CRC检测数据是否正确。
;initialize table with values
tabInit proc uses edi
LOCAL @len: DWORD
mov edi, offset crc_tab
xor ecx, ecx
mov @len, ecx
R@@:
mov eax, @len
mov ecx, 8h
@@:
test eax, 1h
.if ZERO?
shr eax, 1h
.else
shr eax, 1h
xor eax, 0EDB88320h
.endif
loop @B
stosd
inc @len
cmp @len, 100h
jl R@@
return 0
tabInit endp
;calculates CRC32 value.
calc proc uses esi buffer:DWORD, length:DWORD
mov esi, buffer
mov ecx, length
mov ebx, offset crc_tab
mov edx, 0ffffffffh
@@:
xor eax, eax
lodsb
xor al, dl
mov eax, DWORD PTR [ebx + eax]
shr edx, 8h
xor edx, eax
loop @B
mov eax, edx
ret
calc endp