Hallo,
ich habe in den letzten Tagen einige Stunden mit der
DEC verbracht. Nun sitze ich an einem kleinen Problem fest, wo ich Ideen brauche (Alternativtitel:
DEC ASM Portierung 1 von vielen).
Delphi-Quellcode:
procedure Increment8(
var Value; Add: LongWord);
assembler;
// Value := Value + 8 * Add
// Value is array[0..7] of LongWord
asm
MOV ECX,EDX
LEA EDX,[EDX * 8]
SHR ECX,29
// 12/13/2011 Fixed
ADD [EAX].DWord[ 0],EDX
ADC [EAX].DWord[ 4],ECX
ADC [EAX].DWord[ 8],0
ADC [EAX].DWord[12],0
ADC [EAX].DWord[16],0
ADC [EAX].DWord[20],0
ADC [EAX].DWord[24],0
ADC [EAX].DWord[28],0
JC HashingOverflowError
end;
Das ganze findet bei Hashfunktionen seine Anwendung. Konkret geht es um die Bit-Zählung, die in Hashkalkulationen einfließt.
Ich habe jetzt die Wahl: x64
ASM oder PurePascal.
Anwendungsbeispiel für o.g. Funktion:
Delphi-Quellcode:
SwapLongBuffer(FCount, FCount, 4);
PLongWord(@FBuffer[FBufferSize - 16])^ := FCount[3];
PLongWord(@FBuffer[FBufferSize - 12])^ := FCount[2];
PLongWord(@FBuffer[FBufferSize - 8])^ := FCount[1];
PLongWord(@FBuffer[FBufferSize - 4])^ := FCount[0];
DoTransform(Pointer(FBuffer));
Ich habe da so meine Probleme, Increment8 ohne großen Aufwand in PurePascal umzusetzen (ich komme ja nicht an die Carry Flags).
Ideen für eine in dem Anwendungsbeispiel taugliche Umsetzung eines 256 bit Integers? 4 UInts, da auch 32 Byte? Wie sieht es da mit Problemen im oberen Bereich von 2^63−1 aus? Ich will ja alte Delphi Versionen ebenfalls unterstützen...
Gruß
Assertor