Расчет CRC24 на Ассемблере
CRC24 - еще одна разновидность контрольной суммы. Как можно увидеть из названия, ее размер составляет 24 бита, или 3 байта. Я пока не нашел практического применения этому хешу, так же как и программ, использующих его. Но раз есть алгоритм, то почему бы его не реализовать на Ассемблере? Начнем с наиболее компактной реализации без использования таблицы.Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша CRC24
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX = полученный хеш
- ;-----------------------------------------------------------------------
- proc CRC24 lpData:DWORD, dSize:DWORD
- push ebx ecx edx esi
- CRC24_POLYNOM = 1864CFBh
- ; Инициализация
- mov eax,0B704CEh
- ; Длина строки
- cmp [dSize],0
- je .loc_ret
- ; Указатель на начало строки
- xor ecx,ecx
- @@:
- ; Получить символ из строки
- mov ebx,[lpData]
- movzx edx,byte [ebx+ecx]
- shl edx,16
- xor eax,edx
- xor esi,esi
- .loc_cycle:
- shl eax,1
- test eax,1000000h
- jz .loc_next
- xor eax,CRC24_POLYNOM
- jmp .loc_next
- .loc_next:
- inc esi
- cmp esi,8
- jb .loc_cycle
- ; Следующий символ
- inc ecx
- cmp ecx,[dSize]
- jb @b
- .loc_ret:
- and eax,0FFFFFFh
- pop esi edx ecx ebx
- ret
- endp
Более объемный в плане хранимых данных, но более быстрый в скорости выполнения - это табличный вариант алгоритма хеширования. Вот так выглядит заранее рассчитанная таблица размером 256 DWORD.
Code (Assembler) : Убрать нумерацию
- crc24table:
- dd 00000000h, 00864CFBh, 008AD50Dh, 000C99F6h, 0093E6E1h
- dd 0015AA1Ah, 001933ECh, 009F7F17h, 00A18139h, 0027CDC2h
- dd 002B5434h, 00AD18CFh, 003267D8h, 00B42B23h, 00B8B2D5h
- dd 003EFE2Eh, 00C54E89h, 00430272h, 004F9B84h, 00C9D77Fh
- dd 0056A868h, 00D0E493h, 00DC7D65h, 005A319Eh, 0064CFB0h
- dd 00E2834Bh, 00EE1ABDh, 00685646h, 00F72951h, 007165AAh
- dd 007DFC5Ch, 00FBB0A7h, 000CD1E9h, 008A9D12h, 008604E4h
- dd 0000481Fh, 009F3708h, 00197BF3h, 0015E205h, 0093AEFEh
- dd 00AD50D0h, 002B1C2Bh, 002785DDh, 00A1C926h, 003EB631h
- dd 00B8FACAh, 00B4633Ch, 00322FC7h, 00C99F60h, 004FD39Bh
- dd 00434A6Dh, 00C50696h, 005A7981h, 00DC357Ah, 00D0AC8Ch
- dd 0056E077h, 00681E59h, 00EE52A2h, 00E2CB54h, 006487AFh
- dd 00FBF8B8h, 007DB443h, 00712DB5h, 00F7614Eh, 0019A3D2h
- dd 009FEF29h, 009376DFh, 00153A24h, 008A4533h, 000C09C8h
- dd 0000903Eh, 0086DCC5h, 00B822EBh, 003E6E10h, 0032F7E6h
- dd 00B4BB1Dh, 002BC40Ah, 00AD88F1h, 00A11107h, 00275DFCh
- dd 00DCED5Bh, 005AA1A0h, 00563856h, 00D074ADh, 004F0BBAh
- dd 00C94741h, 00C5DEB7h, 0043924Ch, 007D6C62h, 00FB2099h
- dd 00F7B96Fh, 0071F594h, 00EE8A83h, 0068C678h, 00645F8Eh
- dd 00E21375h, 0015723Bh, 00933EC0h, 009FA736h, 0019EBCDh
- dd 008694DAh, 0000D821h, 000C41D7h, 008A0D2Ch, 00B4F302h
- dd 0032BFF9h, 003E260Fh, 00B86AF4h, 002715E3h, 00A15918h
- dd 00ADC0EEh, 002B8C15h, 00D03CB2h, 00567049h, 005AE9BFh
- dd 00DCA544h, 0043DA53h, 00C596A8h, 00C90F5Eh, 004F43A5h
- dd 0071BD8Bh, 00F7F170h, 00FB6886h, 007D247Dh, 00E25B6Ah
- dd 00641791h, 00688E67h, 00EEC29Ch, 003347A4h, 00B50B5Fh
- dd 00B992A9h, 003FDE52h, 00A0A145h, 0026EDBEh, 002A7448h
- dd 00AC38B3h, 0092C69Dh, 00148A66h, 00181390h, 009E5F6Bh
- dd 0001207Ch, 00876C87h, 008BF571h, 000DB98Ah, 00F6092Dh
- dd 007045D6h, 007CDC20h, 00FA90DBh, 0065EFCCh, 00E3A337h
- dd 00EF3AC1h, 0069763Ah, 00578814h, 00D1C4EFh, 00DD5D19h
- dd 005B11E2h, 00C46EF5h, 0042220Eh, 004EBBF8h, 00C8F703h
- dd 003F964Dh, 00B9DAB6h, 00B54340h, 00330FBBh, 00AC70ACh
- dd 002A3C57h, 0026A5A1h, 00A0E95Ah, 009E1774h, 00185B8Fh
- dd 0014C279h, 00928E82h, 000DF195h, 008BBD6Eh, 00872498h
- dd 00016863h, 00FAD8C4h, 007C943Fh, 00700DC9h, 00F64132h
- dd 00693E25h, 00EF72DEh, 00E3EB28h, 0065A7D3h, 005B59FDh
- dd 00DD1506h, 00D18CF0h, 0057C00Bh, 00C8BF1Ch, 004EF3E7h
- dd 00426A11h, 00C426EAh, 002AE476h, 00ACA88Dh, 00A0317Bh
- dd 00267D80h, 00B90297h, 003F4E6Ch, 0033D79Ah, 00B59B61h
- dd 008B654Fh, 000D29B4h, 0001B042h, 0087FCB9h, 001883AEh
- dd 009ECF55h, 009256A3h, 00141A58h, 00EFAAFFh, 0069E604h
- dd 00657FF2h, 00E33309h, 007C4C1Eh, 00FA00E5h, 00F69913h
- dd 0070D5E8h, 004E2BC6h, 00C8673Dh, 00C4FECBh, 0042B230h
- dd 00DDCD27h, 005B81DCh, 0057182Ah, 00D154D1h, 0026359Fh
- dd 00A07964h, 00ACE092h, 002AAC69h, 00B5D37Eh, 00339F85h
- dd 003F0673h, 00B94A88h, 0087B4A6h, 0001F85Dh, 000D61ABh
- dd 008B2D50h, 00145247h, 00921EBCh, 009E874Ah, 0018CBB1h
- dd 00E37B16h, 006537EDh, 0069AE1Bh, 00EFE2E0h, 00709DF7h
- dd 00F6D10Ch, 00FA48FAh, 007C0401h, 0042FA2Fh, 00C4B6D4h
- dd 00C82F22h, 004E63D9h, 00D11CCEh, 00575035h, 005BC9C3h
- dd 00DD8538h
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша CRC24
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX = полученный хеш
- ;-----------------------------------------------------------------------
- proc CRC24 lpData:DWORD, dSize:DWORD
- push ebx ecx edx
- ; Инициализация
- mov eax,0B704CEh
- ; Длина строки
- cmp [dSize],0
- je .loc_ret
- ; Указатель на начало строки
- xor ecx,ecx
- @@:
- ; Получить символ из строки
- mov ebx,[lpData]
- mov edx,eax
- shr edx,16
- xor dl,byte [ebx+ecx]
- and edx,0FFh
- shl edx,2
- shl eax,8
- xor eax,[crc24table+edx]
- ; Следующий символ
- inc ecx
- cmp ecx,[dSize]
- jb @b
- .loc_ret:
- and eax,0FFFFFFh
- pop edx ecx ebx
- ret
- endp
В приложении два варианта программ расчета CRC24 - с использованием таблицы и без нее.
Просмотров: 5720 | Комментариев: 6
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(04.01.2015 в 18:00):
Нерационально как-то :) Можно оптимизировать и оптимизировать.
user
(04.01.2015 в 16:05):
Вверну в качестве оффтопа.
Пару раз использовал для идентификации файлов простенький алгоритм подсчёта контрольной суммы PE-EXE, выдранный из микрософтовского линкера:
;;- - - - - -- - - - - - - - -- - -- - - - - -- - - - - -- - - ->8
xor edx,edx ;;clear edx
mov SUM32,edx ;;clear SUM32
mov ecx,length_of_file
inc ecx ;;round up to WORD
mov byte ptr [esi+ecx],0 ;;clear additional byte
shr ecx,1 ;;ecx=words in file
@@next_word:
mov dx,[esi] ;;load next word of file
add SUM32,edx
shr SUM32,10h
mov dx,word ptr SUM32
add SUM32,edx
add esi,2 ;;esi->next word of file
loop @@next_word
mov eax,SUM32
add eax,length_of_file ;;eax+=length_of_file
mov checksum,eax ;;checksum=SUM32+length_of_file
;;- - - - - -- - - - - - - - -- - -- - - - - -- - - - - -- - - ->8
Пару раз использовал для идентификации файлов простенький алгоритм подсчёта контрольной суммы PE-EXE, выдранный из микрософтовского линкера:
;;- - - - - -- - - - - - - - -- - -- - - - - -- - - - - -- - - ->8
xor edx,edx ;;clear edx
mov SUM32,edx ;;clear SUM32
mov ecx,length_of_file
inc ecx ;;round up to WORD
mov byte ptr [esi+ecx],0 ;;clear additional byte
shr ecx,1 ;;ecx=words in file
@@next_word:
mov dx,[esi] ;;load next word of file
add SUM32,edx
shr SUM32,10h
mov dx,word ptr SUM32
add SUM32,edx
add esi,2 ;;esi->next word of file
loop @@next_word
mov eax,SUM32
add eax,length_of_file ;;eax+=length_of_file
mov checksum,eax ;;checksum=SUM32+length_of_file
;;- - - - - -- - - - - - - - -- - -- - - - - -- - - - - -- - - ->8
user
(04.01.2015 в 15:48):
Упс.. Память подвела. Проверил - действительно, CRC16,32,*48*,64.
24 нет. По кратности спутал с CRC48..
24 нет. По кратности спутал с CRC48..
ManHunter
(04.01.2015 в 08:42):
Если я не ошибаюсь, из нестандартных хешей там использовалась CRC48, по крайней мере, в версии под MS-DOS. CRC24 в адинфе я что-то не припомню.
И то CRC48 тут - это совмещение CRC16 и CRC32
user
(04.01.2015 в 02:04):
Приходит на ум только одно преимущество перед 32-бит контрольной суммой - при хранении большой базы данных о файлах экономится 25% места, если данные плотно упакованы в структурах..
Например, в ревизоре ADINF в своё время опционально использовалась CRC24, наверное, именно с целью экономии места для базы данных в сочетании с большей надёжностью, чем у CRC16.
Например, в ревизоре ADINF в своё время опционально использовалась CRC24, наверное, именно с целью экономии места для базы данных в сочетании с большей надёжностью, чем у CRC16.
Добавить комментарий
Заполните форму для добавления комментария
начать с того, что накапливать сумму в регистре.