Thema: Delphi CompToStr

Einzelnen Beitrag anzeigen

Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: CompToStr

  Alt 21. Nov 2004, 17:17
ich weiß nicht ob du bereits eine bessere lösung gefunden hast, aber ich hab mich in den letzten tagen mal etwas stärker mit dem thema comp auseinandergesetzt, und herausgekommen ist diese funktion(-sansammlung):

Delphi-Quellcode:
{ unterstützende Funktionen: }

const cwChop: Word = $1F32;

procedure Int;
asm
  SUB ESP,$02
  FSTCW WORD PTR [ESP]
  FWAIT
  FLDCW cwChop
  FRNDINT
  FWAIT
  FLDCW WORD PTR [ESP]
  ADD ESP,$02
end;

function CompMod10(C: Comp): Byte;
const Ten: Integer = $0A;
asm
  ADD ESP,-$04
  FILD QWORD PTR [ESP+$0C]
  FIDIV DWORD PTR [TEN]
  FST
  CALL Int
  FSUBP
  FIMUL DWORD PTR [TEN]
  FISTP DWORD PTR [ESP]
  POP EAX
  AND EAX,$FF
  CMP AL,$0A
  JB @@End
  NEG AL
@@End:
end;

function CompDivMod10(var C: Comp): Byte;
const Ten: Integer = $0A;
asm
  PUSH DWORD PTR [EAX+$04] // bzw.:
  PUSH DWORD PTR [EAX] //
  FILD QWORD PTR [EAX] // function CompDivMod10(...): Byte;
  FIDIV DWORD PTR [TEN] // begin
  CALL Int // Result := CompMod10(C);
  FISTP QWORD PTR [EAX] // C := Int(C/10); // System.Int
  CALL CompMod10 // end;
end;

function CompLen(C: Comp): Byte;
const Ten: Integer = $0A;
asm
  PUSH EDX // bzw.:
  SUB ESP,$02 //
  FSTCW WORD PTR [ESP] // function CompLen(...): Byte;
  FLDCW WORD PTR [cwChop] // begin
  BT DWORD PTR [ESP+$12],31 // Result := Byte(C < 0);
  SETB DL // repeat
@@Loop: // Inc(Result);
  INC DL // C := Int(C / 10); // System.Int
  FILD QWORD PTR [ESP+$0E] // until C = 0;
  FIDIV DWORD PTR [TEN] // end;
  FRNDINT
  FISTP QWORD PTR [ESP+$0E]
  BSR EAX,DWORD PTR [ESP+$12]
  JNZ @@Loop
  BSR EAX,DWORD PTR [ESP+$0E]
  JNZ @@Loop
  MOVZX EAX,DL
  FLDCW WORD PTR [ESP]
  ADD ESP,$02
  POP EDX
end;

{ Die Hauptfunktion: }

function CompToStr(C: Comp): string;
var I: Integer;
begin
  SetLength(Result,CompLen(C));
  if C < 0 then Result[1] := '-';
  I := Length(Result);
  repeat
    Result[I] := Char( CompDivMod10(C) + 48);
    Dec(I);
  until C = 0;
end;
hab mir allerdings verkniffen 1000er-Trennzeichen einzubauen (ich find die sehn blöd aus )
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat