Blog. Just Blog

Расчет CRC8 на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Контрольная сумма CRC8 применяется в основном для коротких сетевых пакетов и в микроконтроллерах. Из-за большой вероятности появления коллизий, использовать ее можно или для контроля целостности небольших объемах данных (оптимально - до 15 байт информации), или в случаях, когда возможность появления искажений исходных данных крайне мала. Алгоритм расчета CRC8 реализуется очень просто, работает очень быстро, из-за чего до сих пор находит свое применение. Первый вариант - прямой расчет.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления хеша CRC8
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       AL = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    CRC8 lpData:DWORD, dSize:DWORD
  13.         push    ebx ecx edx esi edi
  14.  
  15.         CRC8_POLYNOM = 31h
  16.  
  17.         ; Инициализация
  18.         mov     al,0FFh
  19.  
  20.         ; Длина строки
  21.         cmp     [dSize],0
  22.         je      .loc_ret
  23.  
  24.         ; Указатель на начало строки
  25.         xor     ecx,ecx
  26. @@:
  27.         ; Получить символ из строки
  28.         mov     ebx,[lpData]
  29.         xor     al,byte [ebx+ecx]
  30.  
  31.         xor     esi,esi
  32. .loc_cycle:
  33.         test    al,80h
  34.         jz      .loc_1
  35.  
  36.         shl     al,1
  37.         xor     al,CRC8_POLYNOM
  38.         jmp     .loc_next
  39. .loc_1:
  40.         shl     al,1
  41. .loc_next:
  42.         inc     esi
  43.         cmp     esi,8
  44.         jb      .loc_cycle
  45.  
  46.         ; Следующий символ
  47.         inc     ecx
  48.         cmp     ecx,[dSize]
  49.         jb      @b
  50.  
  51. .loc_ret:
  52.         and     eax,0FFh
  53.  
  54.         pop     edi esi edx ecx ebx
  55.         ret
  56. endp
Этот вариант компактный, но не самый быстрый по скорости вычисления. Более скоростной алгоритм расчета CRC8 - с использованием заранее подготовленной таблицы.
  1. ; Таблица для расчета CRC8
  2. crc8_t  db 000h, 031h, 062h, 053h, 0C4h, 0F5h, 0A6h, 097h
  3.         db 0B9h, 088h, 0DBh, 0EAh, 07Dh, 04Ch, 01Fh, 02Eh
  4.         db 043h, 072h, 021h, 010h, 087h, 0B6h, 0E5h, 0D4h
  5.         db 0FAh, 0CBh, 098h, 0A9h, 03Eh, 00Fh, 05Ch, 06Dh
  6.         db 086h, 0B7h, 0E4h, 0D5h, 042h, 073h, 020h, 011h
  7.         db 03Fh, 00Eh, 05Dh, 06Ch, 0FBh, 0CAh, 099h, 0A8h
  8.         db 0C5h, 0F4h, 0A7h, 096h, 001h, 030h, 063h, 052h
  9.         db 07Ch, 04Dh, 01Eh, 02Fh, 0B8h, 089h, 0DAh, 0EBh
  10.         db 03Dh, 00Ch, 05Fh, 06Eh, 0F9h, 0C8h, 09Bh, 0AAh
  11.         db 084h, 0B5h, 0E6h, 0D7h, 040h, 071h, 022h, 013h
  12.         db 07Eh, 04Fh, 01Ch, 02Dh, 0BAh, 08Bh, 0D8h, 0E9h
  13.         db 0C7h, 0F6h, 0A5h, 094h, 003h, 032h, 061h, 050h
  14.         db 0BBh, 08Ah, 0D9h, 0E8h, 07Fh, 04Eh, 01Dh, 02Ch
  15.         db 002h, 033h, 060h, 051h, 0C6h, 0F7h, 0A4h, 095h
  16.         db 0F8h, 0C9h, 09Ah, 0ABh, 03Ch, 00Dh, 05Eh, 06Fh
  17.         db 041h, 070h, 023h, 012h, 085h, 0B4h, 0E7h, 0D6h
  18.         db 07Ah, 04Bh, 018h, 029h, 0BEh, 08Fh, 0DCh, 0EDh
  19.         db 0C3h, 0F2h, 0A1h, 090h, 007h, 036h, 065h, 054h
  20.         db 039h, 008h, 05Bh, 06Ah, 0FDh, 0CCh, 09Fh, 0AEh
  21.         db 080h, 0B1h, 0E2h, 0D3h, 044h, 075h, 026h, 017h
  22.         db 0FCh, 0CDh, 09Eh, 0AFh, 038h, 009h, 05Ah, 06Bh
  23.         db 045h, 074h, 027h, 016h, 081h, 0B0h, 0E3h, 0D2h
  24.         db 0BFh, 08Eh, 0DDh, 0ECh, 07Bh, 04Ah, 019h, 028h
  25.         db 006h, 037h, 064h, 055h, 0C2h, 0F3h, 0A0h, 091h
  26.         db 047h, 076h, 025h, 014h, 083h, 0B2h, 0E1h, 0D0h
  27.         db 0FEh, 0CFh, 09Ch, 0ADh, 03Ah, 00Bh, 058h, 069h
  28.         db 004h, 035h, 066h, 057h, 0C0h, 0F1h, 0A2h, 093h
  29.         db 0BDh, 08Ch, 0DFh, 0EEh, 079h, 048h, 01Bh, 02Ah
  30.         db 0C1h, 0F0h, 0A3h, 092h, 005h, 034h, 067h, 056h
  31.         db 078h, 049h, 01Ah, 02Bh, 0BCh, 08Dh, 0DEh, 0EFh
  32.         db 082h, 0B3h, 0E0h, 0D1h, 046h, 077h, 024h, 015h
  33.         db 03Bh, 00Ah, 059h, 068h, 0FFh, 0CEh, 09Dh, 0ACh
Функция расчета CRC8 с помощью таблицы:
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления хеша CRC8 с использованием таблицы
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       AL = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    CRC8 lpData:DWORD, dSize:DWORD
  13.         push    ebx ecx
  14.  
  15.         ; Инициализация
  16.         mov     eax,0FFh
  17.  
  18.         ; Длина строки
  19.         cmp     [dSize],0
  20.         je      .loc_ret
  21.  
  22.         ; Указатель на начало строки
  23.         xor     ecx,ecx
  24. @@:
  25.         ; Получить символ из строки
  26.         mov     ebx,[lpData]
  27.         xor     al,byte [ebx+ecx]
  28.         mov     al,byte [crc8_t+eax]
  29.  
  30.         ; Следующий символ
  31.         inc     ecx
  32.         cmp     ecx,[dSize]
  33.         jb      @b
  34. .loc_ret:
  35.         and     eax,0FFh
  36.  
  37.         pop     ecx ebx
  38.         ret
  39. endp
В этом случае достигается максимальная скорость расчета, но появляются дополнительные данные в виде таблицы. Выберите нужный вам вариант расчета CRC8 в зависимости от того, что требуется для решения поставленной задачи - скорость работы или компактность кода. Пример использования:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. somedata db 'Yeah! I like Flat Assembler!',0 ; Исходные данные для хеширования
  5.  
  6. ; Сегмент кода
  7. section '.code' code readable executable
  8.         ...
  9.         ; Расчет длины строки. Для бинарных данных lstrlen лучше не использовать
  10.         invoke  lstrlen,somedata
  11.         ; Расчет CRC8
  12.         stdcall CRC8,somedata,eax
  13.         ; AL = 0AAh 
В приложении два варианта программ расчета CRC8 - с использованием таблицы и без нее.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

CRC8.Demo.zip (5,861 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 11635 | Комментариев: 3

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Андрей (08.08.2020 в 17:47):
Сорян-)
Реально осознаешь свою ошибку только после того как носом ткнут. На лицо классическая "профдеформация".  Перекладываю алгоритм под 8 битный МК, вот и заклинило. При том раза три просмотрел, перед тем как вопрос писать, но не отпускает восьмибитность. Потому и очевидного не вижу. Спасибо за пояснение.
ManHunter (08.08.2020 в 16:47):
Это не совсем так. Размер регистра - 32 бита, размер операнда - 8 бит. Обнуляется все, кроме содержимого AL. Конкретно в этом случае эту команду действительно можно убрать. Но очень хорошей привычкой будет всегда оставлять только нужную часть результата, независимо от используемой разрядности.
Андрей (08.08.2020 в 14:40):
Доброго дня.

Никак не могу понять для чего на выходе из функции табличного расчета сделано так
.loc_ret:
        and     eax,0FFh
Ведь по сути and 0хFF над любым значением, оставит это значение неизменным.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0074 сек.) / Память: 4.5 Mb
Наверх