ASM-версия этой функции (не такая оптимизированная, но все же 0x59 байт по сравнению с 0x69 моего компилятора версии C ++).
Если вы знакомы с ASM, этого будет достаточно, чтобы понять упомянутый сегмент кода C ++ и всю функцию в целом.
unsigned short crc16(void *memptr, int len)
{
unsigned short crc = 0;//CRC16_INIT;
__asm
{
MOV ESI, len
while_s:
DEC ESI
CMP ESI, 0
JL while_e
XOR EAX, EAX
MOV AX, WORD PTR DS:[crc]
MOV EBX, len
SUB EBX, ESI
DEC EBX
MOV ECX, memptr
MOV BL, BYTE PTR DS:[ECX+EBX]
XOR AL, BL
XOR BL, BL
for_s:
CMP BL, 8
JGE for_e
INC BL
MOV DX, AX
SHR AX, 1
AND DX, 1
JE for_j
XOR AX, 0xA001//CRC16_POLY
for_j:
JMP for_s
for_e:
MOV WORD PTR DS:[crc], AX
JMP while_s
while_e:
XOR EAX, EAX
MOV AX, WORD PTR DS:[crc]
}
}