init_crc_table:
        xor     edx, edx
        mov     edi, crc_table
.1:
        mov     ecx, 8
        mov     eax, edx
.2:
        shr     eax, 1
        jnc     @f
        xor     eax, 0xEDB88320
@@:
        loop    .2
        stosd
        inc     dl
        jnz     .1
        ret

crc:
; in: ecx=size, esi->buffer
; out: eax=crc
        or      eax, -1
        jecxz   .end
.loop:
        movzx   edx, al
        xor     dl, byte [esi]
        inc     esi
        shr     eax, 8
        xor     eax, [crc_table+edx*4]
        loop    .loop
.end:
        xor     eax, -1
        ret