Assembly snippet naar C++

Status
Niet open voor verdere reacties.

mell1ej

Gebruiker
Lid geworden
21 mei 2009
Berichten
8
Hallo,

Ik ben bezig met een klein servertje te schrijven in c++, alles gaat goed maar om de packets te controlleren gebruik ik een hash functie die voor een paar regels uit assembler bestaat.

De functie werkt, maar het zou gewoon mooier zijn om alles in c++ te hebben.

Nou was mij vraag of iemand deze regels kan omzetten in c++ mijn niveau in assemler is hier namelijk niet hoog genoeg voor.

Het deel met de assembler code:
Code:
for (uint32 i = 0; i < len; i++)
{	
	int32 tmp = 0;
	int32 cesi = (int32)buffer + counter;

	__asm 
	{
		mov eax, 0

		mov esi, cesi					
		mov al, byte ptr[esi]
		mov tmp, eax
	}

	crc32 = crc32 >> 8 ^ crcTab1[tmp ^ crc32 & 0xFF];
	counter++;
}
Als er ook nog een uitleg bij kan zou het natuurlijk helemaal super zijn :D

Bij voorbaat dank :thumb:
 
Laatst bewerkt:
Voor welke processor is dit?
Wat is buffer?
Wat is counter?
Wat is esi?

Als je wat debugoutput voor het asm-stuk zet waar je de tmp variabele (e.a.) output en daarna weer, dan kun je vanzelf uitvogelen wat er gebeurd.
 
Bedank voor je reactie :D

Het is voor een x86 processor.
buffer is een pointer naar de buffer die gehashed moet worden.
counter is een int32.
esi is volgens de debugger een unsiged long.

Zou het helpen als de rest van de code ook zou plaatsen?

Het is me al wel gelukt om een regel weg te laten:
Code:
for (uint32 i = 0; i < len; i++)
			{	
				uint8 tmp = 0;
				int32 cesi = (int32)buffer + counter;

				__asm 
				{
					mov esi, cesi					
					mov al, byte ptr[esi]
					mov tmp, al
				}

				crc32 = crc32 >> 8 ^ crcTab1[tmp ^ crc32 & 0xFF];
				counter++;
			}
 
Laatst bewerkt:
Indien de buffer die gehashed moet worden een char-array is, zou je de code door het onderstaande kunnen vervangen:

[cpp]
for (uint32 i = 0; i < len; i++){
int32 tmp = buffer;
crc32 = crc32 >> 8 ^ crcTab1[tmp ^ crc32 & 0xFF];
}[/cpp]

Ik heb nu niet zo heel veel tijd, maar zal de rest vanavond wel toelichten.
 
Bedankt voor je reactie :D
Alleen krijg ik een Access violation als ik je code probeer te gebuiken :(

buffer is een uint32 pointer, ik plaats de hele functie wel even:
[CPP]
uint32 CalculateCRC32(int8* value, uint32 length)
{
uint32* buffer = (uint32*)value + 2;

uint32 len = length - 8;
uint32 crc32 = 0xffffffff;
uint32 counter = 0;

if (len >= 32)
{
for(uint32 i = 0; i < len >> 5; i++)
{
crc32 ^= buffer[counter];
len -= 4;

for(uint32 i = 0; i < 7; i++)
{
counter++;
crc32 = crcTab2[crc32 >> 16 & 0xFF] ^ crcTab3[crc32 >> 8 & 0xFF] ^ crcTab1[crc32 >> 24] ^ crcTab4[crc32 & 0xFF] ^ buffer[counter];
len -= 4;
}

crc32 = crcTab2[crc32 >> 16 & 0xFF] ^ crcTab3[crc32 >> 8 & 0xFF] ^ crcTab1[crc32 >> 24] ^ crcTab4[crc32 & 0xFF];
counter++;
}
}

if (len >= counter)
{
for (uint32 i = 0; i < (len >> 2); i++)
{
crc32 ^= buffer[counter];
len -= 4;

crc32 = crcTab2[crc32 >> 16 & 0xFF] ^ crcTab3[crc32 >> 8 & 0xFF] ^ crcTab1[crc32 >> 24] ^ crcTab4[crc32 & 0xFF];
counter++;
}
}

if (len > 0)
{
counter *= 4;

for (uint32 i = 0; i < len; i++)
{
uint8 tmp = 0;
int32 cesi = (int32)buffer + counter;

__asm
{
mov esi, cesi
mov al, byte ptr[esi]
mov tmp, al
}

crc32 = crc32 >> 8 ^ crcTab1[tmp ^ crc32 & 0xFF];
counter++;
}
}

return crc32 ^ 0xFFFFFFFF;
}
[/CPP]
 
Laatst bewerkt:
Het onderstaande zou moeten werken:

[cpp]
for (uint32 i = 0; i < len; i++)
{
uint8 tmp = *(uint8 *)((int32)buffer+counter);
crc32 = crc32 >> 8 ^ crcTab1[tmp ^ crc32 & 0xFF];
counter++;
}
[/cpp]

(ik heb het even getest met voor uint8 = unsigned char en int32 = int)
 
Hij werkt nu :D
Maar zou je misschien nog kunnen toelichten wat er nou precies gebeurden in die paar regels assembler?

Hartelijk bedankt!
 
Hij werkt nu :D
Maar zou je misschien nog kunnen toelichten wat er nou precies gebeurden in die paar regels assembler?

Hartelijk bedankt!

Die code leest gewoon een karakter uit de buffer:

[cpp]
mov esi, cesi -> cesi kopiëren naar esi (source index pointer)
mov al, byte ptr[esi] -> value[index] kopiëren naar al (8 bits register)
mov tmp, al -> oftewel tmp = value[index]
[/cpp]


Een voorbeeld in C++ is misschien wat duidelijker:

[cpp]
char test[] = "Dit is een test";
unsigned int *buffer = (unsigned int *)test+2;
for (int index = 0; index < strlen(test); index++)
std::cout << *(unsigned char *)((int)buffer-8+index);

// of nog duidelijker:

unsigned int *buffer = (unsigned int *)test;
for (int index = 0; index < strlen(test); index++)
std::cout << *(unsigned char *)((int)buffer+index);
[/cpp]

edit: eigenlijk komt het gewoon neer op wat ik als eerste postte:

[cpp]
tmp = buffer[index] // alleen is buffer in jouw code de array value
[/cpp]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan