![]() |
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:
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.
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; Mit freundlichem Gruß |
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; |
Re: Die Funktion IntToStr übersetzen
Delphi-Quellcode:
fix'd
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; (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. |
Re: Die Funktion IntToStr übersetzen
Alles klar, wieder was dazu gelernt. ;)
Vielen Dank für die schnellen Antworten |
Re: Die Funktion IntToStr übersetzen
Tipp: Alle Zahlen-/Wortfunktionen, die ein Prozessor berechnen kann, kann man auch in Delphi schreiben. ;)
|
Re: Die Funktion IntToStr übersetzen
Zitat:
|
Re: Die Funktion IntToStr übersetzen
Stimmt. Muss mans halt umschreiben.
Delphi-Quellcode:
So ungefähr... glaub ich...
function DivMod(Value, Base: Integer var Result, Remainder: Integer);
asm mov ecx, edx cdq idiv ecx end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz