Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die Funktion IntToStr übersetzen (https://www.delphipraxis.net/134204-die-funktion-inttostr-uebersetzen.html)

Forlan 17. Mai 2009 21:17


Die Funktion IntToStr übersetzen
 
Schönen guten Abend zusammen. Aus Intresse hab ich mir mal überlegt ob es eigentlich möglich ist die Funktion IntToStr zu übersetzen, also ohne den Assembler.

Delphi-Quellcode:
function IntToStr(Value: Integer): string;
//  FmtStr(Result, '%d', [Value]);
asm
        PUSH   ESI
        MOV    ESI, ESP
        SUB    ESP, 16
        XOR    ECX, ECX      // base: 0 for signed decimal
        PUSH   EDX           // result ptr
        XOR    EDX, EDX      // zero filled field width: 0 for no leading zeros
        CALL   CvtInt
        MOV    EDX, ESI
        POP    EAX           // result ptr
        CALL   System.@LStrFromPCharLen
        ADD    ESP, 16
        POP    ESI
end;
Ich habe mich bisher noch recht wenig mit dem Assembler beschäftigt, darum wäre es vllt. mal interessant Ansätze für eine mögliche Übersetzung zu sehen.

Mit freundlichem Gruß

jfheins 17. Mai 2009 21:25

Re: Die Funktion IntToStr übersetzen
 
Also die einfachste (aber wahscheinlich nicht die schnellste) wird die hier sein:

Delphi-Quellcode:
function IntToStr(AValue: Integer; ABase: Byte = 10): String;
var
  i: Integer;
begin
  Result := IfThen(AValue < 0, '-', '');
  repeat
    Result := Result + AValue mod ABase;
    AValue := AValue div Base;
  until AValue = 0;
end;

3_of_8 17. Mai 2009 21:29

Re: Die Funktion IntToStr übersetzen
 
Delphi-Quellcode:
function IntToStr(AValue: Integer; ABase: Byte = 10): String;
var
  i, digit: Integer;
begin

  Result := IfThen(AValue < 0, '-', '');
  AValue := abs(AValue); //mod gibt iirc sonst negative Werte zurück.

  repeat

    digit := AValue mod ABase;
    if digit < 10 then
      Result := Result + chr(digit+48)
    else
      Result := Result + chr(digit+55);
   
    AValue := AValue div Base;

  until AValue = 0;

end;
fix'd

(Lässt sich noch unter Verwendung von DivMod optimieren)

EDIT: Funktioniert so nur für Basen zwischen 2 und 36, keine Überprüfung - bei 1 gäbs ne Endlosschleife, bei 0 ne Exception und bei allem größer als 36 würde es unschön aussehen.

Forlan 17. Mai 2009 21:33

Re: Die Funktion IntToStr übersetzen
 
Alles klar, wieder was dazu gelernt. ;)
Vielen Dank für die schnellen Antworten

3_of_8 17. Mai 2009 21:35

Re: Die Funktion IntToStr übersetzen
 
Tipp: Alle Zahlen-/Wortfunktionen, die ein Prozessor berechnen kann, kann man auch in Delphi schreiben. ;)

himitsu 17. Mai 2009 21:39

Re: Die Funktion IntToStr übersetzen
 
Zitat:

Zitat von 3_of_8
(Lässt sich noch unter Verwendung von DivMod optimieren)

nur maximal für Word/ShortInt ... zumindestens mit der DivMod-Version von Delphi

3_of_8 17. Mai 2009 22:24

Re: Die Funktion IntToStr übersetzen
 
Stimmt. Muss mans halt umschreiben.

Delphi-Quellcode:
function DivMod(Value, Base: Integer var Result, Remainder: Integer);
asm
  mov ecx, edx
  cdq
  idiv ecx
end;
So ungefähr... glaub ich...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz