Einzelnen Beitrag anzeigen

Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 7. Jan 2012, 23:26
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
Frederik

Geändert von Assertor ( 8. Jan 2012 um 13:41 Uhr) Grund: Titel geändert
  Mit Zitat antworten Zitat