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