AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Die Funktion IntToStr übersetzen

Ein Thema von Forlan · begonnen am 17. Mai 2009 · letzter Beitrag vom 17. Mai 2009
Antwort Antwort
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#1

Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:17
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ß
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.375 Beiträge
 
#2

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:29
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#4

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:33
Alles klar, wieder was dazu gelernt.
Vielen Dank für die schnellen Antworten
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:35
Tipp: Alle Zahlen-/Wortfunktionen, die ein Prozessor berechnen kann, kann man auch in Delphi schreiben.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.592 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 21:39
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Die Funktion IntToStr übersetzen

  Alt 17. Mai 2009, 22:24
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...
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf