AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rotate in Delphi-Language?

Ein Thema von himitsu · begonnen am 26. Okt 2014 · letzter Beitrag vom 28. Okt 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#11

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 12:17
Ich hab es bis heute nicht verstanden, warum es absolut gar kein Inline für AssemblerOnly routinen gibt.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 12:22
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#13

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 12:27
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.
Ich schätze das würde funktionieren, wenn man einen gewissen satz an restriktionen setzen würde.

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.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 13:41
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:
function ROL(Value: Integer; Count: Byte): Integer; inline;
asm
  ROL &Value, &Count
end;
Aber nun sind ja Value und Result ja im selben Register und schon weiß Delphi nicht mehr wo das Result hin ist.
Delphi-Quellcode:
function ROL(Value: Integer; Count: Byte): Integer; inline;
asm
  MOV &Result, &Value
  ROL &Result, &Count
end;
Und schon hat man wieder einen blöden Code.



Zitat:
Du weißt in der inline-Methode nicht welche Register in der aufrufenden Methode noch gebraucht werden
Das weiß man auch in der Funktion nicht, aber es gibt ja Regeln welche Register man immer sichern/wiederherstellen muß.
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.
$2B or not $2B

Geändert von himitsu (28. Okt 2014 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 13:56
Im Windows könnte ich die geheimen MD5/SHA1-WinAPIs der advapi.dll verwenden.
Die benutzen wir auch, ja. Da die Crypto-API gut dokumentiert ist, ist das auch sehr einfach zu implementieren. Die Header-Datei habe ich soweit nötig selbst übersetzt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#16

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 14:08
Im Windows könnte ich die geheimen MD5/SHA1-WinAPIs der advapi.dll verwenden.
Die benutzen wir auch, ja. Da die Crypto-API gut dokumentiert ist, ist das auch sehr einfach zu implementieren. Die Header-Datei habe ich soweit nötig selbst übersetzt.
Hab mir ja den Context als Record deklariert und darin als Record-Methoden direkt die API angebunden.
Der unsichtbare Self-Parameter passt super über den ersten Context-VAR-Parameter der API.

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?)
$2B or not $2B

Geändert von himitsu (28. Okt 2014 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#17

AW: Rotate in Delphi-Language?

  Alt 28. Okt 2014, 14:18
Aber nun sind ja Value und Result ja im selben Register und schon weiß Delphi nicht mehr wo das Result hin ist.
Delphi-Quellcode:
function ROL(Value: Integer; Count: Byte): Integer; inline;
asm
  MOV &Result, &Value
  ROL &Result, &Count
end;
Und schon hat man wieder einen blöden Code.
Man könnte durch neue Postfixe bei den parametern dem Compiler mitteilen, dass ein Parameter sowohl als in als auch als out fungiert(out kanns nur einen geben, dann fällt das Result weg).

Sowas wie:

Delphi-Quellcode:
procedure ROL(InOut Value: Integer; Count: Byte);inline;
asm
  ROL &Value, &Count
end;
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.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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