![]() |
AW: Rotate in Delphi-Language?
Ich hab es bis heute nicht verstanden, warum es absolut gar kein Inline für AssemblerOnly routinen gibt.
|
AW: Rotate in Delphi-Language?
Weils ziemlich "gefährlich" ist.
Du weißt in der inline-Methode nicht welche Register in der aufrufenden Methode noch gebraucht werden, du weißt nicht wie der Stack aussieht etc. Und Delphi weiß nicht was du da in Assembler geschrieben hast und schafft es dann einfach nicht dein Assemblercode in die entsprechenden Methoden einzubauen. Denn da wie schon gesagt der Code meistens nicht 1:1 in die aufrufende Methode passt (ohne irgendwas kaputt zu machen) müsste Delphi die Semantik deines Codes erkennen und deinen Ursprungscode dynamisch an die jeweilige Situation der aufrufenden Methode anpassen. |
AW: Rotate in Delphi-Language?
Zitat:
Max 2 Paremeter + Result Parameter und Result werden fest auf einen eigenen register gemapped (Deswegen auch nur support für 2 plus result) Somit sind die parameter(+Result) auch nur in Mnemonics mit Register-Parametern zulässig. Durch das strikte mapping des Input/Output sollte der compiler in der lage sein die Parameter der aufrufenden funktion vor dem inlined asm zu sichern bzw collisionen zu erkennen. |
AW: Rotate in Delphi-Language?
Und dann kann Delphi nicht die "Variablen" verschieben, was dann eh kranken Code erzeugt (umkopieren der Variablen in Register/Stack), wenn es geinlined wird.
Siehe Beispiel in #1: Für EAX und DL werden die Parameter (übergebenen) Variablen ja nicht an den stellen ersetzt, sondern vorher dort reinkopiert und nachher das Result wieder zurück. OK, man könnte das ja auch so schreiben, wenn Delphi nicht intelligent genug ist rauszubekommen was welcher Parameter ist.
Delphi-Quellcode:
Aber nun sind ja Value und Result ja im selben Register und schon weiß Delphi nicht mehr wo das Result hin ist.
function ROL(Value: Integer; Count: Byte): Integer; inline;
asm ROL &Value, &Count end;
Delphi-Quellcode:
Und schon hat man wieder einen blöden Code.
function ROL(Value: Integer; Count: Byte): Integer; inline;
asm MOV &Result, &Value ROL &Result, &Count end; Zitat:
Entweder es behandelt die Register während des Inline-Codes so, als wären sie wie beim CALL belegt oder es sichert (PUSH/POP) sich die entsprechenden Register. Und da es ein SinglePassCompiler ist, müsste Delphi immer alles sichern, da es vorher noch nicht weiß welche Register in der Prozedur verwendet werden. [edit] halt nee, das wurde vorher kompiliert und man müsste es sich nur merken. |
AW: Rotate in Delphi-Language?
Zitat:
|
AW: Rotate in Delphi-Language?
Zitat:
Der unsichtbare Self-Parameter passt super über den ersten Context-VAR-Parameter der API. :angel: Aber da fehlt nun halt die OSX/iOS/Android-Implementation der Funktionen, drum wollte ich dort meinen alten Code als Pascal einbinden (war bisher in Win32-Assembler geschrieben), außer jemand findet eine "kompatible" API in diesen Plattformen. Oder ich schau eben, ob es nicht eine Alternative gibt, welche möglichst überall funktioniert. (z.B. die Indy, welche doch überall funktionieren/existieren?) |
AW: Rotate in Delphi-Language?
Zitat:
Sowas wie:
Delphi-Quellcode:
schon weiß der compiler wieder, wo der Hase lang läuft. Und festgelegten Output braucht man primär, wenn die inline funktion in einer expression benutzt wird.
procedure ROL(InOut Value: Integer; Count: Byte);inline;
asm ROL &Value, &Count end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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