Сборник по задачам и примерам Assembler



         

«Зеркальный» табличный алгоритм CRC32 - часть 3


:С(}С32-таблица для зеркального табличного алгоритма вычисления CRC32

tabl_32_mirror dd 256 dup (0)

1 en_tabl_32_mi rror=$-tabl_32_nii rror

adr_tabl_32_mirror dd tabl_32_mirror

polinom dd 0EDB88320h

.code

:.........

;----........расчитываем зеркальную CRC32-Ta6flnuy.........

les di,adr_tabl_32_mirror

add di,len_tabl_32_mirror-4

std ;идем назад по таблице

mov ex.255

mov ebx.poli nom ml: xor eax.eax

mov al.cl :индекс в таблице для вычисления CRC

push сх сложенные циклы

mov сх,8 m2: shr eax.l

jnc m3 ;старшие разряды не равны - выполняем сдвиг (частное нас не интересует) :старшие разряды равны - выполняем XOR: * xor eax,ebx:ax XOR polinom m3: loop m2

pop ex

stosd

loop ml закончили расчет (Ж32-таблицы

xor bx.bx

mov eax. OFFFFFFFFh

Ids si.adr_bit_string

mov cx.len_bit_string+4 ;4 - длина crc_32 m4: mov bl.al

shr eax.8

xor bl.[si]

xor eax.tabl_32_mirror[bx]

inc si loop m4 :сравнить - результат должен быть константой 6b202ca2h

Этот вариант работы алгоритма вычисления CRC32 удобен тем, что не нужно знать длину собственно исходной последовательности (без значения CRC). Достаточно просто обработать весь входной поток, не различая в строке завершающую ее подстроку с CRC. Далее необходимо сравнить содержимое регистра ЕАХ с 6b202ca2h. Если эти значения равны, значит, исходная последовательность нарушена не была. Для получения собственно строки достаточно отбросить последние 4 байта сообщения, полученного приемником. И последнее замечание, которое говорит о том, что проблема вычисления CRC неоднозначна для понимания и предоставляет большое поле для проведения различных экспериментов и совершенствования существующих алгоритмов. Небольшой поправкой в алгоритме работы источника можно сделать так, что успехом целостности при принятии приемником сообщения может быть не указанная выше константа, а нуль. Для этого источнику достаточно не объединять вычисленное значение CRC32 по XOR с Offffffffh, а просто добавить его к исходной последовательности. Оба эти варианта хороши тем, что не нужно заранее знать длину анализируемого сообщения.

На этом, пожалуй, можно и закончить обсуждение проблемы вычисления CRC. На примере этой достаточно сложной задачи были в очередной раз продемонстрированы варианты использования средств ассемблера для обработки информации на различных уровнях, вплоть до битового. За дальнейшими подробностями по проблематике вычисления CRC обратитесь к соответствующим источникам.

 




Содержание  Назад