Go Back   FlashFXP Forums > >

Programming Need help with C/C++/Delphi? Ask here and make us all laugh.

Closed Thread
Thread Tools Rate Thread Display Modes
Old 08-05-2004, 08:54 AM   #1
FlashFXP Registered User
ioFTPD Administrator
darkone's Avatar
Join Date: Dec 2001
Posts: 2,230
Default Assembler crc32

Here's one in C (it's suprisingly hard to find algorithm that uses only 32bit registers)

DWORD Crc32(LPVOID lpMemory, LONG lLength, DWORD dwCrc32)
	if (! lLength) {
		return dwCrc32;

	__asm {
		push ebx
		mov  edi, lLength
		mov  eax, DWORD PTR dwCrc32		// load initial parameter (dwCrc32)
		mov  edx, DWORD PTR lpMemory	// load initial parameter pointer
		add  edx, edi
		mov  ecx, edi
		shl  ecx, 1
		sub  edi, ecx
	// for (i = -len;  i != 0 ;  i ++) 
		// dwCRC32 = crc32_tab[ (dwCRC32 ^ s[i + len]) & 0xff ] ^ (dwCRC32 >> 8)
		mov  ebx, DWORD PTR [edx + edi]		// load parameter value (s[i])
		xor  ebx, eax						// perform exclusive OR (dwCRC32 ^ s[i])
		and  ebx, 0xff						// clear upper 24 bits
		shr  eax, 8							// shift dwCRC32 value (divide by 256)
		xor  eax, DWORD PTR [crc32_table + ebx*4]	// exclusive OR with look up table
		inc  edi
		jnz  SHORT $L278
		Pop  ebx
... uhh, yea... as usual use it only in io & gl scripts
darkone is offline  
Old 08-05-2004, 10:37 PM   #2
Posse Member
Ultimate Scripter
ioFTPD Administrator
Join Date: Dec 2002
Posts: 1,956

ioB use that to calculate the crc of a file:

/* Need an unsigned type capable of holding 32 bits; */
typedef DWORD UNS_32_BITS;

static UNS_32_BITS crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };

Boolean_T crc32file(char *name, DWORD *crc, long *charcnt)
  FILE *fin;

	DWORD dwCrc32 = 0xFFFFFFFF, dwBytesRead;
	char buffer[65536];

	if ((fin=fopen(name, "rb"))==NULL) {
		return Error_;
	dwBytesRead = (DWORD)fread(buffer,1,65535,fin);
	while (dwBytesRead) {
		charcnt += dwBytesRead;
		/* Register use:
			eax - CRC32 value
			ebx - a lot of things
			ecx - CRC32 value
			edx - address of end of buffer
			esi - address of start of buffer
			edi - CRC32 table */
			push esi					/* Save the esi and edi registers */
			push edi
			mov eax, dwCrc32            /* Load the pointer to dwCrc32 */
			mov ecx, dwCrc32            /* Dereference the pointer to load dwCrc32 */
			lea edi, crc_32_tab
			lea esi, buffer             /* Load buffer */
			mov ebx, dwBytesRead        /* Load dwBytesRead */
			lea edx, [esi + ebx]        /* Calculate the end of the buffer */
				xor eax, eax            /* Clear the eax register */
				mov bl, byte ptr [esi]  /* Load the current source byte */
				mov al, cl              /* Copy crc value into eax */
				inc esi                 /* Advance the source pointer */
				xor al, bl              /* Create the index into the CRC32 table */
				shr ecx, 8
				mov ebx, [edi + eax * 4]/* Get the value out of the table */
				xor ecx, ebx            /* xor with the current byte */
				cmp edx, esi            /* Have we reached the end of the buffer? */
				jne crc32loop
			pop edi                     /* Restore the edi and esi registers */
			pop esi
			mov eax, dwCrc32            /* Load the pointer to dwCrc32 */
			mov dwCrc32, ecx            /* Write the result */
		dwBytesRead = (DWORD)fread(buffer,1,65535,fin);

	*crc = ~dwCrc32;
	return Success_;
Mouton is offline  
Closed Thread

dwcrc32, dword, ebx, edi, mov

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT -5. The time now is 09:14 PM.

Parts of this site powered by vBulletin Mods & Addons from DragonByte Technologies Ltd. (Details)