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

Прямой табличный алгоритм 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
push ex сложенные циклы
mov ex,8 m2: shl eax.l
jnc m3;старшие разряды не равны – выполняем сдвиг (частное нас не интересует)
:старшие разряды равны – выполняем XOR:
хоr eax.ebx:ax XOR polinom m3: loop m2
pop сх
stosd
loop ml: закончили расчет СРО2-таблицы
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
xor eax. OFFFFFFFFh
;если исходная последовательность цела, то должно получиться значение crc32=9c970409h
;его можно сравнить с исходным и на этом закончить работу или продолжить до победного.
:то есть до 0:
mov ex.4: 4 (длина сгс_32):в si адрес сгс_32
mov ebx.crc_32
bswap ebx
mov crc_32.ebx m5: xor ebx.ebx
shld ebx.eax.8
shl eax.8
xor bl.[si]
xor eax .tabl_32_direct[bx]
inc si
loop m5:должен быть 0

Заметьте, что для получения нулевого результата нам пришлось использовать команду BSWAP, чтобы "перевернуть" значение в поле сгс_32.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.