Сборник по задачам и примерам 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

;СЯС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:

хог 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 :должен быть О

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







 



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