Прямой табличный алгоритм CRC32
Как и любой табличный алгоритм, табличный алгоритм вычисления CRC32 требует задания CRC-таблицы. Ее можно задать в программе статически, явно прописав значения элементов таблицы в сегменте кода, или динамически, вычислив значения элементов таблицы перед началом расчета CRC. Ниже приведена программа вычисления CRC-таблицы для полинома 04clldb7.
Прямой табличный алгоритм CRC32 удобно рассматривать со стороны участников процесса, как это мы делали выше. Источник выполняет следующие действия.
:prgO9_O5.asm – программа вычисления CRC-таблицы для полинома 04clldb7. .data ;СRС32-таблица для прямого табличного алгоритма вычисления CRC32 tabl_32_direct dd 256 dup (0) len_tabl_32_direct =$-tabl_32_direct adr_tabl_32_direct dd tabl_32_direct polinom dd 04clldb7h .code les di.adr_tabl_32_direct add di,len_tabl_32_direct-4 std:идем назад по таблице mov ex,255 mov ebx.polinom / ml: xor eax.eax shrd eax.ecx,8 push ex сложенные циклы mov ex.8 m2: shl eax.l jnc m3:старшие разряды неравны – выполняем сдвиг (частное нас не интересует) ;старшйе разряды равны – выполняем XOR: xor eax.ebx:ax XOR polinom m3:loop m2 pop ex
- Делает начальную установку регистра, в котором будет производиться формирование CRC, значением OFFFFFFFFh.
- Вычисляет значение CRC для каждого байта исходной последовательности, принцип которой показан на схеме (см. рис. 9.9). Читатель понимает, что хотя эта схема иллюстрирует принцип вычисления CRC16, но для 32-разрядного алгоритма нужно только увеличить размер элементов таблицы до 32 бит и задействовать весь регистр ЕАХ.
- Объединяет по XOR итоговое значение в ЕАХ со значением OFFFFFFFFh.
- Добавляет вычисленное значение в конец двоичной исходной последовательности. После этого его можно передать по назначению.
Ниже приведена программа вычисления CRC32 по прямому табличному алгоритму.
;prg09_06.asm – программа вычисления CRC32 по прямому табличному алгоритму. ;исходная битовая последовательность в символах bit_string db "123456789" len_bit_string=$-bit_string сгс_32 dd 0;сюда мы поместим рассчитанное значение CRC32 adr_bit_string dd bit_string ;СRС32-таблица для прямого табличного алгоритма вычисления CRC32 tabl_32_direct dd 256 dup (0) len_tabl_32_direct =$-tabl_32_direct adr_tabl_32_direct dd tabl_32_direct polinom dd 04clldb7h .code :----………расчитываем CRC32 таблицу les di.adr_tabl_32_direct add di.len_tabl_32_direct-4 * std;идем назад по таблице mov ex.255 mov ebx, polinom ml: xor eax.eax shrd eax.ecx.8 push ex сложенные циклы mov ex.8 m2: shl eax.l jnc m3:старшие разряды неравны – выполняем сдвиг (частное нас не интересует) :старшие разряды равны – выполняем XOR: xor eax.ebx:ax XOR polinom m3: loop m2 pop ex stosd loop ml :…..--……закончили расчет CRC32 таблицы mov eax, OFFFFFFFFh Ids si.adr_bit_string mov cx.len_bit_string m4: xor ebx.ebx shld ebx.eax.8 shl eax.8 xor bl.[si] xor eax .tabl_32_direct[bx] inc si 1 oop m4:запишем crc-32 в конец (или начало, см. обсуждение ниже) последовательности: xor eax. OFFFFFFFFh mov crc_32.eax;добавляем в конец исходной последовательности ;Значение CRC32 для строки "123456789" равно 9c970409h.