Прямой табличный алгоритм 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.