Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм подсчета CRC64, как и остальных контрольных сумм, предназначен для проверки целостности данных при их передаче или хранении. Также контрольные суммы могут использоваться для быстрого сравнения двух наборов данных на неэквивалентность: с большой вероятностью различные наборы данных будут иметь неравные контрольные суммы. Длина в 64 бита позволяет сократить число возможных коллизий, а использование предварительно посчитанной таблицы делает скорость вычисления достаточно большой.

В этой статье я покажу два варианта алгоритма подсчета CRC64. Они отличаются используемыми полиномами и, соответственно, полученными на их основе таблицами. Сами алгоритмы отличаются ненамного. Первый вариант - прямой или нормальный, принятый как стандарт ISO 3309. Он используется в различных программах, например, в базе данных PostgreSQL. Здесь за основу берется полином 0x42F0E1EBA9EA3693.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления CRC64 - Прямой табличный алгоритм (PostgreSQL)
  3. ;-----------------------------------------------------------------------
  4. ; Параметры:
  5. ;   lData  - указатель на участок памяти для расчета CRC64
  6. ;   dLen   - размер участка в байтах
  7. ; На выходе:
  8. ;   EAX:EDX = CRC64 участка памяти
  9. ;-----------------------------------------------------------------------
  10. proc calc_CRC64 lData:dword, dLen:dword
  11.         ; Сохранить регистры
  12.         push    edi esi ebx ecx
  13.  
  14.         ; Указатель на данные для подсчета CRC64
  15.         mov     esi,[lData]
  16.         ; Размер участка данных
  17.         mov     ecx,[dLen]
  18.  
  19.         xor     eax,eax
  20.  
  21.         ; Начальное значение CRC64 = -1
  22.         mov     ebx,0FFFFFFFFh
  23.         mov     edx,ebx
  24. @@:
  25.         ; Следующий символ данных
  26.         lodsb
  27.  
  28.         ; Вычислить смещение QWORD в таблице
  29.         mov     edi,edx
  30.         shr     edi,24
  31.         xor     eax,edi
  32.  
  33.         ; Вычислить значение CRC64
  34.         shld    edx,ebx,8
  35.         shl     ebx,8
  36.         xor     ebx,dword [crc64table+eax*8]
  37.         xor     edx,dword [crc64table+eax*8+4]
  38.  
  39.         loop    @b
  40.  
  41.         xchg    eax,ebx
  42.  
  43.         ; Финализация CRC64
  44.         not     eax
  45.         not     edx
  46.  
  47.         ; Восстановить регистры
  48.         pop     ecx ebx esi edi
  49.  
  50.         ret
  51. endp
Эта функция подразумевает, что подсчет контрольной суммы выполняется сразу для всей строки данных, без промежуточных накопительных подсчетов. Если требуется выполнять подсчет для нескольких блоков, например, периодически поступающие потоковые данные или очень большие объемы информации, то алгоритм придется немного модифицировать. Для этого начальное значение CRC64 при втором и последующем расчете инициализируется промежуточным значением с предыдущего подсчета, а финализация выполняется только после вычисления CRC64 последнего блока данных.

Перед тем, как считать контрольную сумму, нужно сгенерировать таблицу. Ее размер 256 х 8 байт, по одному QWORD для каждого байта.
  1. ;-----------------------------------------------------------------------
  2. ; Функция создания таблицы для расчета CRC64
  3. ;-----------------------------------------------------------------------
  4. proc init_CRC64
  5.         pusha
  6.  
  7.         ; Указатель на выделенную под таблицу память
  8.         mov     edi,crc64table
  9.         ; Расчитать значения для всех 256 байт
  10.         xor     ebx,ebx
  11.  
  12. calc_crc64table:
  13.         ; EDX:EAX
  14.         xor     eax,eax
  15.         mov     edx,ebx
  16.         shl     edx,24
  17.  
  18.         mov     ecx,8
  19. do_polynom:
  20.         test    edx,edx         ; Определить знак числа
  21.         pushf
  22.         shld    edx,eax,1
  23.         shl     eax,1
  24.         popf
  25.         jns     @f      ; XOR выполняется только если QWORD отрицательный
  26.         xor     edx,042F0E1EBh  ; Полином = 0x42F0E1EBA9EA3693
  27.         xor     eax,0A9EA3693h
  28. @@:
  29.         ; Следующий бит
  30.         loop    do_polynom
  31.  
  32.         ; Записать qword в таблицу
  33.         stosd
  34.         mov     eax,edx
  35.         stosd
  36.  
  37.         inc     ebx
  38.         cmp     ebx,256
  39.         ; Следующий байт
  40.         jb      calc_crc64table
  41.  
  42.         popa
  43.         ret
  44. endp
Ну и, конечно же, сама таблица для расчета. Ее можно подключать в уже готовом виде или генерировать по мере надобности описанной выше функцией. Если еще немного напрячься, то можно обойтись вообще без таблицы, как это сделано на примере подсчета CRC32. Но имейте в виду, что это повлечет за собой снижение скорости подсчета.
  1. ;-----------------------------------------------------------------------
  2. ; Таблица для расчета CRC64 (ISO 3309)
  3. ;-----------------------------------------------------------------------
  4. crc64table:
  5.   dq 00000000000000000h, 042F0E1EBA9EA3693h, 085E1C3D753D46D26h
  6.   dq 0C711223CFA3E5BB5h, 0493366450E42ECDFh, 00BC387AEA7A8DA4Ch
  7.   dq 0CCD2A5925D9681F9h, 08E224479F47CB76Ah, 09266CC8A1C85D9BEh
  8.   dq 0D0962D61B56FEF2Dh, 017870F5D4F51B498h, 05577EEB6E6BB820Bh
  9.   dq 0DB55AACF12C73561h, 099A54B24BB2D03F2h, 05EB4691841135847h
  10.   dq 01C4488F3E8F96ED4h, 0663D78FF90E185EFh, 024CD9914390BB37Ch
  11.   dq 0E3DCBB28C335E8C9h, 0A12C5AC36ADFDE5Ah, 02F0E1EBA9EA36930h
  12.   dq 06DFEFF5137495FA3h, 0AAEFDD6DCD770416h, 0E81F3C86649D3285h
  13.   dq 0F45BB4758C645C51h, 0B6AB559E258E6AC2h, 071BA77A2DFB03177h
  14.   dq 0334A9649765A07E4h, 0BD68D2308226B08Eh, 0FF9833DB2BCC861Dh
  15.   dq 0388911E7D1F2DDA8h, 07A79F00C7818EB3Bh, 0CC7AF1FF21C30BDEh
  16.   dq 08E8A101488293D4Dh, 0499B3228721766F8h, 00B6BD3C3DBFD506Bh
  17.   dq 0854997BA2F81E701h, 0C7B97651866BD192h, 000A8546D7C558A27h
  18.   dq 04258B586D5BFBCB4h, 05E1C3D753D46D260h, 01CECDC9E94ACE4F3h
  19.   dq 0DBFDFEA26E92BF46h, 0990D1F49C77889D5h, 0172F5B3033043EBFh
  20.   dq 055DFBADB9AEE082Ch, 092CE98E760D05399h, 0D03E790CC93A650Ah
  21.   dq 0AA478900B1228E31h, 0E8B768EB18C8B8A2h, 02FA64AD7E2F6E317h
  22.   dq 06D56AB3C4B1CD584h, 0E374EF45BF6062EEh, 0A1840EAE168A547Dh
  23.   dq 066952C92ECB40FC8h, 02465CD79455E395Bh, 03821458AADA7578Fh
  24.   dq 07AD1A461044D611Ch, 0BDC0865DFE733AA9h, 0FF3067B657990C3Ah
  25.   dq 0711223CFA3E5BB50h, 033E2C2240A0F8DC3h, 0F4F3E018F031D676h
  26.   dq 0B60301F359DBE0E5h, 0DA050215EA6C212Fh, 098F5E3FE438617BCh
  27.   dq 05FE4C1C2B9B84C09h, 01D14202910527A9Ah, 093366450E42ECDF0h
  28.   dq 0D1C685BB4DC4FB63h, 016D7A787B7FAA0D6h, 05427466C1E109645h
  29.   dq 04863CE9FF6E9F891h, 00A932F745F03CE02h, 0CD820D48A53D95B7h
  30.   dq 08F72ECA30CD7A324h, 00150A8DAF8AB144Eh, 043A04931514122DDh
  31.   dq 084B16B0DAB7F7968h, 0C6418AE602954FFBh, 0BC387AEA7A8DA4C0h
  32.   dq 0FEC89B01D3679253h, 039D9B93D2959C9E6h, 07B2958D680B3FF75h
  33.   dq 0F50B1CAF74CF481Fh, 0B7FBFD44DD257E8Ch, 070EADF78271B2539h
  34.   dq 0321A3E938EF113AAh, 02E5EB66066087D7Eh, 06CAE578BCFE24BEDh
  35.   dq 0ABBF75B735DC1058h, 0E94F945C9C3626CBh, 0676DD025684A91A1h
  36.   dq 0259D31CEC1A0A732h, 0E28C13F23B9EFC87h, 0A07CF2199274CA14h
  37.   dq 0167FF3EACBAF2AF1h, 0548F120162451C62h, 0939E303D987B47D7h
  38.   dq 0D16ED1D631917144h, 05F4C95AFC5EDC62Eh, 01DBC74446C07F0BDh
  39.   dq 0DAAD56789639AB08h, 0985DB7933FD39D9Bh, 084193F60D72AF34Fh
  40.   dq 0C6E9DE8B7EC0C5DCh, 001F8FCB784FE9E69h, 043081D5C2D14A8FAh
  41.   dq 0CD2A5925D9681F90h, 08FDAB8CE70822903h, 048CB9AF28ABC72B6h
  42.   dq 00A3B7B1923564425h, 070428B155B4EAF1Eh, 032B26AFEF2A4998Dh
  43.   dq 0F5A348C2089AC238h, 0B753A929A170F4ABh, 03971ED50550C43C1h
  44.   dq 07B810CBBFCE67552h, 0BC902E8706D82EE7h, 0FE60CF6CAF321874h
  45.   dq 0E224479F47CB76A0h, 0A0D4A674EE214033h, 067C58448141F1B86h
  46.   dq 0253565A3BDF52D15h, 0AB1721DA49899A7Fh, 0E9E7C031E063ACECh
  47.   dq 02EF6E20D1A5DF759h, 06C0603E6B3B7C1CAh, 0F6FAE5C07D3274CDh
  48.   dq 0B40A042BD4D8425Eh, 0731B26172EE619EBh, 031EBC7FC870C2F78h
  49.   dq 0BFC9838573709812h, 0FD39626EDA9AAE81h, 03A28405220A4F534h
  50.   dq 078D8A1B9894EC3A7h, 0649C294A61B7AD73h, 0266CC8A1C85D9BE0h
  51.   dq 0E17DEA9D3263C055h, 0A38D0B769B89F6C6h, 02DAF4F0F6FF541ACh
  52.   dq 06F5FAEE4C61F773Fh, 0A84E8CD83C212C8Ah, 0EABE6D3395CB1A19h
  53.   dq 090C79D3FEDD3F122h, 0D2377CD44439C7B1h, 015265EE8BE079C04h
  54.   dq 057D6BF0317EDAA97h, 0D9F4FB7AE3911DFDh, 09B041A914A7B2B6Eh
  55.   dq 05C1538ADB04570DBh, 01EE5D94619AF4648h, 002A151B5F156289Ch
  56.   dq 04051B05E58BC1E0Fh, 087409262A28245BAh, 0C5B073890B687329h
  57.   dq 04B9237F0FF14C443h, 00962D61B56FEF2D0h, 0CE73F427ACC0A965h
  58.   dq 08C8315CC052A9FF6h, 03A80143F5CF17F13h, 07870F5D4F51B4980h
  59.   dq 0BF61D7E80F251235h, 0FD913603A6CF24A6h, 073B3727A52B393CCh
  60.   dq 031439391FB59A55Fh, 0F652B1AD0167FEEAh, 0B4A25046A88DC879h
  61.   dq 0A8E6D8B54074A6ADh, 0EA16395EE99E903Eh, 02D071B6213A0CB8Bh
  62.   dq 06FF7FA89BA4AFD18h, 0E1D5BEF04E364A72h, 0A3255F1BE7DC7CE1h
  63.   dq 064347D271DE22754h, 026C49CCCB40811C7h, 05CBD6CC0CC10FAFCh
  64.   dq 01E4D8D2B65FACC6Fh, 0D95CAF179FC497DAh, 09BAC4EFC362EA149h
  65.   dq 0158E0A85C2521623h, 0577EEB6E6BB820B0h, 0906FC95291867B05h
  66.   dq 0D29F28B9386C4D96h, 0CEDBA04AD0952342h, 08C2B41A1797F15D1h
  67.   dq 04B3A639D83414E64h, 009CA82762AAB78F7h, 087E8C60FDED7CF9Dh
  68.   dq 0C51827E4773DF90Eh, 0020905D88D03A2BBh, 040F9E43324E99428h
  69.   dq 02CFFE7D5975E55E2h, 06E0F063E3EB46371h, 0A91E2402C48A38C4h
  70.   dq 0EBEEC5E96D600E57h, 065CC8190991CB93Dh, 0273C607B30F68FAEh
  71.   dq 0E02D4247CAC8D41Bh, 0A2DDA3AC6322E288h, 0BE992B5F8BDB8C5Ch
  72.   dq 0FC69CAB42231BACFh, 03B78E888D80FE17Ah, 07988096371E5D7E9h
  73.   dq 0F7AA4D1A85996083h, 0B55AACF12C735610h, 0724B8ECDD64D0DA5h
  74.   dq 030BB6F267FA73B36h, 04AC29F2A07BFD00Dh, 008327EC1AE55E69Eh
  75.   dq 0CF235CFD546BBD2Bh, 08DD3BD16FD818BB8h, 003F1F96F09FD3CD2h
  76.   dq 041011884A0170A41h, 086103AB85A2951F4h, 0C4E0DB53F3C36767h
  77.   dq 0D8A453A01B3A09B3h, 09A54B24BB2D03F20h, 05D45907748EE6495h
  78.   dq 01FB5719CE1045206h, 0919735E51578E56Ch, 0D367D40EBC92D3FFh
  79.   dq 01476F63246AC884Ah, 0568617D9EF46BED9h, 0E085162AB69D5E3Ch
  80.   dq 0A275F7C11F7768AFh, 06564D5FDE549331Ah, 0279434164CA30589h
  81.   dq 0A9B6706FB8DFB2E3h, 0EB46918411358470h, 02C57B3B8EB0BDFC5h
  82.   dq 06EA7525342E1E956h, 072E3DAA0AA188782h, 030133B4B03F2B111h
  83.   dq 0F7021977F9CCEAA4h, 0B5F2F89C5026DC37h, 03BD0BCE5A45A6B5Dh
  84.   dq 079205D0E0DB05DCEh, 0BE317F32F78E067Bh, 0FCC19ED95E6430E8h
  85.   dq 086B86ED5267CDBD3h, 0C4488F3E8F96ED40h, 00359AD0275A8B6F5h
  86.   dq 041A94CE9DC428066h, 0CF8B0890283E370Ch, 08D7BE97B81D4019Fh
  87.   dq 04A6ACB477BEA5A2Ah, 0089A2AACD2006CB9h, 014DEA25F3AF9026Dh
  88.   dq 0562E43B4931334FEh, 0913F6188692D6F4Bh, 0D3CF8063C0C759D8h
  89.   dq 05DEDC41A34BBEEB2h, 01F1D25F19D51D821h, 0D80C07CD676F8394h
  90.   dq 09AFCE626CE85B507h
Кроме прямого табличного алгоритма может использоваться так называемый "зеркальный" алгоритм подсчета CRC64. Он отличается полиномом 0xC96C5795D7870F42, который является зеркальным отражением нормального полинома, и немного изменен алгоритм подсчета. Этот алгоритм принят в качестве стандарта ассоциацией ECMA (European Computer Manufacturers Association) под номером ECMA-182.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления CRC64 - Зеркальный табличный алгоритм (ECMA-182)
  3. ;-----------------------------------------------------------------------
  4. ; Параметры:
  5. ;   lData  - указатель на участок памяти для расчета CRC64
  6. ;   dLen   - размер участка в байтах
  7. ; На выходе:
  8. ;   EAX:EDX = CRC64 участка памяти
  9. ;-----------------------------------------------------------------------
  10. proc calc_CRC64 lData:dword, dLen:dword
  11.         ; Сохранить регистры
  12.         push    esi ebx ecx
  13.  
  14.         ; Указатель на данные для подсчета CRC64
  15.         mov     esi,[lData]
  16.         ; Размер участка данных
  17.         mov     ecx,[dLen]
  18.  
  19.         xor     eax,eax
  20.  
  21.         ; Начальное значение CRC64 = -1
  22.         mov     ebx,0FFFFFFFFh
  23.         mov     edx,ebx
  24. @@:
  25.         ; Следующий символ данных
  26.         lodsb
  27.  
  28.         ; Вычислить смещение QWORD в таблице
  29.         xor     al,bl
  30.  
  31.         ; Вычислить значение CRC64
  32.         shrd    ebx,edx,8
  33.         shr     edx,8
  34.         xor     ebx,dword [crc64table+eax*8]
  35.         xor     edx,dword [crc64table+eax*8+4]
  36.  
  37.         loop    @b
  38.  
  39.         xchg    eax,ebx
  40.  
  41.         ; Финализация CRC64
  42.         not     eax
  43.         not     edx
  44.  
  45.         ; Восстановить регистры
  46.         pop     ecx ebx esi edi
  47.  
  48.         ret
  49. endp
Как я уже говорил, алгоритм генерации "зеркальной" таблицы тоже немного отличается.
  1. ;-----------------------------------------------------------------------
  2. ; Функция создания таблицы для расчета CRC64
  3. ;-----------------------------------------------------------------------
  4. proc init_CRC64
  5.         pusha
  6.  
  7.         ; Указатель на выделенную под таблицу память
  8.         mov     edi,crc64table
  9.         ; Расчитать значения для всех 256 байт
  10.         xor     ebx,ebx
  11.  
  12. calc_crc64table:
  13.         xor     edx,edx
  14.         mov     eax,ebx
  15.  
  16.         mov     ecx,8
  17. do_polynom:
  18.         shrd    eax,edx,1       ; Определить четность числа
  19.         pushf
  20.         shr     edx,1
  21.         popf
  22.         jnc     @f      ; XOR выполняется только если QWORD нечетный
  23.         xor     edx,0C96C5795h  ; Зеркальный полином = 0xC96C5795D7870F42
  24.         xor     eax,0D7870F42h
  25. @@:
  26.         ; Следующий бит
  27.         loop    do_polynom
  28.  
  29.         ; Записать qword в таблицу
  30.         stosd
  31.         mov     eax,edx
  32.         stosd
  33.  
  34.         inc     ebx
  35.         cmp     ebx,256
  36.         ; Следующий байт
  37.         jb      calc_crc64table
  38.  
  39.         popa
  40.         ret
  41. endp
Готовая таблица для расчета "зеркальной" CRC64.
  1. ;-----------------------------------------------------------------------
  2. ; Таблица для расчета CRC64 (ECMA-182)
  3. ;-----------------------------------------------------------------------
  4. crc64table:
  5.   dq 00000000000000000h, 0B32E4CBE03A75F6Fh, 0F4843657A840A05Bh
  6.   dq 047AA7AE9ABE7FF34h, 07BD0C384FF8F5E33h, 0C8FE8F3AFC28015Ch
  7.   dq 08F54F5D357CFFE68h, 03C7AB96D5468A107h, 0F7A18709FF1EBC66h
  8.   dq 0448FCBB7FCB9E309h, 00325B15E575E1C3Dh, 0B00BFDE054F94352h
  9.   dq 08C71448D0091E255h, 03F5F08330336BD3Ah, 078F572DAA8D1420Eh
  10.   dq 0CBDB3E64AB761D61h, 07D9BA13851336649h, 0CEB5ED8652943926h
  11.   dq 0891F976FF973C612h, 03A31DBD1FAD4997Dh, 0064B62BCAEBC387Ah
  12.   dq 0B5652E02AD1B6715h, 0F2CF54EB06FC9821h, 041E11855055BC74Eh
  13.   dq 08A3A2631AE2DDA2Fh, 039146A8FAD8A8540h, 07EBE1066066D7A74h
  14.   dq 0CD905CD805CA251Bh, 0F1EAE5B551A2841Ch, 042C4A90B5205DB73h
  15.   dq 0056ED3E2F9E22447h, 0B6409F5CFA457B28h, 0FB374270A266CC92h
  16.   dq 048190ECEA1C193FDh, 00FB374270A266CC9h, 0BC9D3899098133A6h
  17.   dq 080E781F45DE992A1h, 033C9CD4A5E4ECDCEh, 07463B7A3F5A932FAh
  18.   dq 0C74DFB1DF60E6D95h, 00C96C5795D7870F4h, 0BFB889C75EDF2F9Bh
  19.   dq 0F812F32EF538D0AFh, 04B3CBF90F69F8FC0h, 0774606FDA2F72EC7h
  20.   dq 0C4684A43A15071A8h, 083C230AA0AB78E9Ch, 030EC7C140910D1F3h
  21.   dq 086ACE348F355AADBh, 03582AFF6F0F2F5B4h, 07228D51F5B150A80h
  22.   dq 0C10699A158B255EFh, 0FD7C20CC0CDAF4E8h, 04E526C720F7DAB87h
  23.   dq 009F8169BA49A54B3h, 0BAD65A25A73D0BDCh, 0710D64410C4B16BDh
  24.   dq 0C22328FF0FEC49D2h, 085895216A40BB6E6h, 036A71EA8A7ACE989h
  25.   dq 00ADDA7C5F3C4488Eh, 0B9F3EB7BF06317E1h, 0FE5991925B84E8D5h
  26.   dq 04D77DD2C5823B7BAh, 064B62BCAEBC387A1h, 0D7986774E864D8CEh
  27.   dq 090321D9D438327FAh, 0231C512340247895h, 01F66E84E144CD992h
  28.   dq 0AC48A4F017EB86FDh, 0EBE2DE19BC0C79C9h, 058CC92A7BFAB26A6h
  29.   dq 09317ACC314DD3BC7h, 02039E07D177A64A8h, 067939A94BC9D9B9Ch
  30.   dq 0D4BDD62ABF3AC4F3h, 0E8C76F47EB5265F4h, 05BE923F9E8F53A9Bh
  31.   dq 01C4359104312C5AFh, 0AF6D15AE40B59AC0h, 0192D8AF2BAF0E1E8h
  32.   dq 0AA03C64CB957BE87h, 0EDA9BCA512B041B3h, 05E87F01B11171EDCh
  33.   dq 062FD4976457FBFDBh, 0D1D305C846D8E0B4h, 096797F21ED3F1F80h
  34.   dq 02557339FEE9840EFh, 0EE8C0DFB45EE5D8Eh, 05DA24145464902E1h
  35.   dq 01A083BACEDAEFDD5h, 0A9267712EE09A2BAh, 0955CCE7FBA6103BDh
  36.   dq 0267282C1B9C65CD2h, 061D8F8281221A3E6h, 0D2F6B4961186FC89h
  37.   dq 09F8169BA49A54B33h, 02CAF25044A02145Ch, 06B055FEDE1E5EB68h
  38.   dq 0D82B1353E242B407h, 0E451AA3EB62A1500h, 0577FE680B58D4A6Fh
  39.   dq 010D59C691E6AB55Bh, 0A3FBD0D71DCDEA34h, 06820EEB3B6BBF755h
  40.   dq 0DB0EA20DB51CA83Ah, 09CA4D8E41EFB570Eh, 02F8A945A1D5C0861h
  41.   dq 013F02D374934A966h, 0A0DE61894A93F609h, 0E7741B60E174093Dh
  42.   dq 0545A57DEE2D35652h, 0E21AC88218962D7Ah, 05134843C1B317215h
  43.   dq 0169EFED5B0D68D21h, 0A5B0B26BB371D24Eh, 099CA0B06E7197349h
  44.   dq 02AE447B8E4BE2C26h, 06D4E3D514F59D312h, 0DE6071EF4CFE8C7Dh
  45.   dq 015BB4F8BE788911Ch, 0A6950335E42FCE73h, 0E13F79DC4FC83147h
  46.   dq 0521135624C6F6E28h, 06E6B8C0F1807CF2Fh, 0DD45C0B11BA09040h
  47.   dq 09AEFBA58B0476F74h, 029C1F6E6B3E0301Bh, 0C96C5795D7870F42h
  48.   dq 07A421B2BD420502Dh, 03DE861C27FC7AF19h, 08EC62D7C7C60F076h
  49.   dq 0B2BC941128085171h, 00192D8AF2BAF0E1Eh, 04638A2468048F12Ah
  50.   dq 0F516EEF883EFAE45h, 03ECDD09C2899B324h, 08DE39C222B3EEC4Bh
  51.   dq 0CA49E6CB80D9137Fh, 07967AA75837E4C10h, 0451D1318D716ED17h
  52.   dq 0F6335FA6D4B1B278h, 0B199254F7F564D4Ch, 002B769F17CF11223h
  53.   dq 0B4F7F6AD86B4690Bh, 007D9BA1385133664h, 04073C0FA2EF4C950h
  54.   dq 0F35D8C442D53963Fh, 0CF273529793B3738h, 07C0979977A9C6857h
  55.   dq 03BA3037ED17B9763h, 0888D4FC0D2DCC80Ch, 0435671A479AAD56Dh
  56.   dq 0F0783D1A7A0D8A02h, 0B7D247F3D1EA7536h, 004FC0B4DD24D2A59h
  57.   dq 03886B22086258B5Eh, 08BA8FE9E8582D431h, 0CC0284772E652B05h
  58.   dq 07F2CC8C92DC2746Ah, 0325B15E575E1C3D0h, 08175595B76469CBFh
  59.   dq 0C6DF23B2DDA1638Bh, 075F16F0CDE063CE4h, 0498BD6618A6E9DE3h
  60.   dq 0FAA59ADF89C9C28Ch, 0BD0FE036222E3DB8h, 00E21AC88218962D7h
  61.   dq 0C5FA92EC8AFF7FB6h, 076D4DE52895820D9h, 0317EA4BB22BFDFEDh
  62.   dq 08250E80521188082h, 0BE2A516875702185h, 00D041DD676D77EEAh
  63.   dq 04AAE673FDD3081DEh, 0F9802B81DE97DEB1h, 04FC0B4DD24D2A599h
  64.   dq 0FCEEF8632775FAF6h, 0BB44828A8C9205C2h, 0086ACE348F355AADh
  65.   dq 034107759DB5DFBAAh, 0873E3BE7D8FAA4C5h, 0C094410E731D5BF1h
  66.   dq 073BA0DB070BA049Eh, 0B86133D4DBCC19FFh, 00B4F7F6AD86B4690h
  67.   dq 04CE50583738CB9A4h, 0FFCB493D702BE6CBh, 0C3B1F050244347CCh
  68.   dq 0709FBCEE27E418A3h, 03735C6078C03E797h, 0841B8AB98FA4B8F8h
  69.   dq 0ADDA7C5F3C4488E3h, 01EF430E13FE3D78Ch, 0595E4A08940428B8h
  70.   dq 0EA7006B697A377D7h, 0D60ABFDBC3CBD6D0h, 06524F365C06C89BFh
  71.   dq 0228E898C6B8B768Bh, 091A0C532682C29E4h, 05A7BFB56C35A3485h
  72.   dq 0E955B7E8C0FD6BEAh, 0AEFFCD016B1A94DEh, 01DD181BF68BDCBB1h
  73.   dq 021AB38D23CD56AB6h, 09285746C3F7235D9h, 0D52F0E859495CAEDh
  74.   dq 06601423B97329582h, 0D041DD676D77EEAAh, 0636F91D96ED0B1C5h
  75.   dq 024C5EB30C5374EF1h, 097EBA78EC690119Eh, 0AB911EE392F8B099h
  76.   dq 018BF525D915FEFF6h, 05F1528B43AB810C2h, 0EC3B640A391F4FADh
  77.   dq 027E05A6E926952CCh, 094CE16D091CE0DA3h, 0D3646C393A29F297h
  78.   dq 0604A2087398EADF8h, 05C3099EA6DE60CFFh, 0EF1ED5546E415390h
  79.   dq 0A8B4AFBDC5A6ACA4h, 01B9AE303C601F3CBh, 056ED3E2F9E224471h
  80.   dq 0E5C372919D851B1Eh, 0A26908783662E42Ah, 0114744C635C5BB45h
  81.   dq 02D3DFDAB61AD1A42h, 09E13B115620A452Dh, 0D9B9CBFCC9EDBA19h
  82.   dq 06A978742CA4AE576h, 0A14CB926613CF817h, 01262F598629BA778h
  83.   dq 055C88F71C97C584Ch, 0E6E6C3CFCADB0723h, 0DA9C7AA29EB3A624h
  84.   dq 069B2361C9D14F94Bh, 02E184CF536F3067Fh, 09D36004B35545910h
  85.   dq 02B769F17CF112238h, 09858D3A9CCB67D57h, 0DFF2A94067518263h
  86.   dq 06CDCE5FE64F6DD0Ch, 050A65C93309E7C0Bh, 0E388102D33392364h
  87.   dq 0A4226AC498DEDC50h, 0170C267A9B79833Fh, 0DCD7181E300F9E5Eh
  88.   dq 06FF954A033A8C131h, 028532E49984F3E05h, 09B7D62F79BE8616Ah
  89.   dq 0A707DB9ACF80C06Dh, 014299724CC279F02h, 05383EDCD67C06036h
  90.   dq 0E0ADA17364673F59h
В приложении примеры программ с исходными текстами для расчета контрольной суммы CRC64 по алгоритмам ISO 3309 и ECMA-182, а также отдельно готовые таблицы для подключения в ваши проекты.

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

CRC64.Demo.zip (21,215 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 5617 | Комментариев: 4

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

Комментарии

Отзывы посетителей сайта о статье
Михаил (21.08.2014 в 02:53):
Чёт я пропустил этот пример... ещё и на официальном сайте FASM'а. Мда... Даже стыдно немного... Ладно, пойду разбираться - надеюсь, код примера внятно закоментирован. Ну и пользуясь случаем, хочу поблагодарить Вас за столь хорошие статьи по фасму.
ManHunter (20.08.2014 в 19:54):
На офсайте все есть, замечательные примеры с исходниками, в том числе и SEH
http://flatassembler.net/examples.php
Михаил (20.08.2014 в 13:29):
Уважаемый ManHunter, могу ли я у Вас попросить сделать статейку про Structured Exception Handling (SEH) с примерами под FASM? Думаю, не только мне это будет интересным. Просто, в интернете не встретил не одной внятной статьи, да и примеров на FASM'е не особо много. В общем, прошу Ваешей помощи)
P.S.: Если откажете, я пойму)
ЖК (30.07.2014 в 03:55):
C CRC64 доводилось видеть много разных вариантов. Например тот же ECMA-182, но без инициализации начального значения crc в -1, а также без not в финализации.

Кстати, это случай, когда родной 64-битный код будет смотреться естественнее, чем 32-битный. Например навскидку init_CRC64:

proc init_CRC64

         push      rax rbx rcx rdx rdi

         mov       rdi, crc64table
         xor       rbx, rbx
         mov       rdx, 0x0C96C5795D7870F42
.inCRC64_1:
         mov       rax, rbx
         mov       rcx, 8
.inCRC64_2:
         shr       rax, 1
         jnc       .inCRC64_3
         xor       rax, rdx
.inCRC64_3:
     dec       rcx
     jnz       .inCRC64_2

     stosq
     inc       rbx
     cmp       rbx, 256
     jb        .inCRC64_1

     pop       rdi rdx rcx rbx rax

     ret
endp

Один в один crc32 с поправкой на константу и размер регистров. С процедурой подсчета - то же самое.

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

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

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