Алгоритм вычисления crc32 by Tziotas Milos

Тема в разделе "WASM.A&O", создана пользователем eeprom, 15 авг 2007.

  1. eeprom

    eeprom New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    3
    Привет!
    В тулзе hash_table(simplest key logger) применен сабж.Как он работает?Желательно в подробностях.Или где про него почитать?
    Кое-что, конечно, понятно.Нетабличный зеркальный метод, да еще оптимизирован(спарены инструкции).Из строки выбирается по байту.Только общий принцип неясен.Вот код:
    proc crc32,lpBuff
    push edi esi ecx ebx
    mov esi,[lpBuff]
    xor ecx,ecx
    lea eax,[ecx-1]
    sub ebx,ebx
    mov edi,0EDB88320h
    @@m1: xor edx,edx
    mov dl,[esi]
    xor dl,al
    @@m2: shr edx,1
    jnc @@m3
    xor edx,edi
    @@m3: inc ecx
    and cl,7
    jnz @@m2
    shr eax,8
    xor eax,edx
    inc esi
    inc ebx
    cmp byte[esi],0
    jne @@m1
    @@end: not eax
    xchg ebx,edx
    pop ebx ecx esi edi
    return
    endp
    Спасибо.
     
  2. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Те че коменты возле каждой строки написать?
     
  3. eeprom

    eeprom New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    3
    К каждой строке комменты не надо.А вот ежели объяснишь, почему он берет байт, кладет его в регистр, ксорит с полиномом, сдвигая вправо(зеркальный метод) а потом делает вот это:
    shr eax,8
    xor eax,edx
    после обработки каждого байта,
    то буду весьма благодарен.Вот для чего этот второй ксор?И почему он первый ксор делает байта с полиномом(4 байта)?
    Хотя классический метод предусматривает ксор заполненного регистра(4 байта) с полиномом.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    eeprom
    Если имеется в виду классический табличный метод, то не с самим полиномом, а с предвычесленными значениями из таблицы, а кусок кода от @@m2 до jnz @@m2 как раз совпадает с алгоритмом расчета таблицы. Другими словами в табличном методе заранее вычисляются значения по алгоритму @@m2...jnz @@m2 для всех dl от 0 до 255 и этот кусок кода заменяется просто на извлечение значения из таблицы при заданном dl
    Код (Text):
    1. @@m1:
    2. xor edx,edx
    3. mov dl,[esi]
    4. xor dl,al
    5.   ;@@m2: shr edx,1  ;все это заранее расчитано для всех dl от 0 до 255
    6.   ;jnc @@m3
    7.   ;xor edx,edi
    8.   ;@@m3: inc ecx
    9.   ;and cl,7
    10.   ;jnz @@m2
    11.   mov edx,[CRC_table+edx]
    12. shr eax,8
    13. xor eax,edx
     
  5. eeprom

    eeprom New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    3
    Большое спасибо, leo!Теперь все ясно как день.
     
  6. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    По случаю, не знает ли кто-нибудь качественных полиномов для расчёта crc32 кроме EDB88320 ??
     
  7. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Proteus
    http://en.wikipedia.org/wiki/CRC32#Commonly_used_and_standardized_CRCs