Привет! В тулзе 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 Спасибо.
К каждой строке комменты не надо.А вот ежели объяснишь, почему он берет байт, кладет его в регистр, ксорит с полиномом, сдвигая вправо(зеркальный метод) а потом делает вот это: shr eax,8 xor eax,edx после обработки каждого байта, то буду весьма благодарен.Вот для чего этот второй ксор?И почему он первый ксор делает байта с полиномом(4 байта)? Хотя классический метод предусматривает ксор заполненного регистра(4 байта) с полиномом.
eeprom Если имеется в виду классический табличный метод, то не с самим полиномом, а с предвычесленными значениями из таблицы, а кусок кода от @@m2 до jnz @@m2 как раз совпадает с алгоритмом расчета таблицы. Другими словами в табличном методе заранее вычисляются значения по алгоритму @@m2...jnz @@m2 для всех dl от 0 до 255 и этот кусок кода заменяется просто на извлечение значения из таблицы при заданном dl Код (Text): @@m1: xor edx,edx mov dl,[esi] xor dl,al ;@@m2: shr edx,1 ;все это заранее расчитано для всех dl от 0 до 255 ;jnc @@m3 ;xor edx,edi ;@@m3: inc ecx ;and cl,7 ;jnz @@m2 mov edx,[CRC_table+edx] shr eax,8 xor eax,edx