"Зеркальный" табличный алгоритм CRC32
В заключение данного раздела обсудим "зеркальный" вариант табличного алгоритма – алгоритм CRC32 (V.42 МККТТ). Этот вариант вычисления CRC обязан своим возникновением существованию последовательного интерфейса, который посылает биты, начиная с наименее значимого (бит 0) и заканчивая самым старшим (бит 7), то есть в обратном порядке. В "зеркальном" регистре все биты отражены относительно центра. Например, 10111011001 есть отражение значения 10011011101.
Вместо того чтобы менять местами биты перед их обработкой, можно зеркально отразить все значения и действия, участвующие в прямом алгоритме. При этом направление расчетов поменяется – байты теперь будут сдвигаться вправо, полином 04clldb7h зеркально отразится относительно его центра, в результате получится значение 0edb88320h. СRС32-таблица будет зеркальным отражением аналогичной таблицы для прямого алгоритма (рис. 9.10).
Рис. 9.10. Схема "Зеркального" табличного алгоритма
Для зеркального алгоритма вычисления CRC32 процесс вычисления такой же, за исключением порядка – сдвиги и заполнение регистра осуществляются вправо. Ниже приведена программа вычисления таблицы для зеркального алгоритма CRC32 и полинома 0EDB88320h.
;prg09_08.asm – программа вычисления таблицы для зеркального алгоритма CRC32 :и полинома 0EDB88320h .data :СRС32-таблица для зеркального табличного алгоритма вычисления CRC32 tabl_32_mirror dd 256 dup (0) len_tabl_32jrrirror=$-tabl_32_mirror adr_tabl_32jTrirror dd tabl_32_mirror polinom dd 0EDB88320h .code les di.adr_tabl_32_mirror add di,len_tabl_32_mirror-4 std;идем назад по таблице mov ex.255 mov ebx.polinom ml: xor eax.eax mov al.cl;индекс в таблице для вычисления CRC push ex сложенные циклы mov ex.8 m2: shr eax.l jnc m3;старшие разряды не равны – выполняем сдвиг (частное нас не интересует) ;старшие разряды равны – выполняем XOR: xor eax.ebx:ax XOR polinom m3: loop m2 pop ex stosd loop ml