• Иллюстрированный самоучитель по задачам и примерам Assembler

    "Зеркальный" табличный алгоритм CRC32

    В заключение данного раздела обсудим "зеркальный" вариант табличного алгоритма – алгоритм CRC32 (V.42 МККТТ). Этот вариант вычисления CRC обязан своим возникновением существованию последовательного интерфейса, который посылает биты, начиная с наименее значимого (бит 0) и заканчивая самым старшим (бит 7), то есть в обратном порядке. В "зеркальном" регистре все биты отражены относительно центра. Например, 10111011001 есть отражение значения 10011011101.

    Вместо того чтобы менять местами биты перед их обработкой, можно зеркально отразить все значения и действия, участвующие в прямом алгоритме. При этом направление расчетов поменяется – байты теперь будут сдвигаться вправо, полином 04clldb7h зеркально отразится относительно его центра, в результате получится значение 0edb88320h. СRС32-таблица будет зеркальным отражением аналогичной таблицы для прямого алгоритма (рис. 9.10).

    Иллюстрированный самоучитель по задачам и примерам Assembler › Вычисление CRC › "Зеркальный" табличный алгоритм CRC32
    Рис. 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
    
    Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.