Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie diese fast identischen ASM methoden vereinheitlichen? (https://www.delphipraxis.net/205063-wie-diese-fast-identischen-asm-methoden-vereinheitlichen.html)

TurboMagic 28. Jul 2020 17:23


Wie diese fast identischen ASM methoden vereinheitlichen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

bin wieder ein wenig an der DEC https://github.com/winkelsdorf/Delph...tionCompendium.
Jetzt habe ich 2 in assembler geschiebene Methoden (siehe angehängte Datei - da sind aber nur diese beiden raus extrahiert).
Diese sind zu 99,9999% identisch, es gibt nur 2 Zeilen die unterschiedlich sind.

Die Zeilen 6 und 13 in der ersten Methode und die korrespondierenden der zweiten Methode.
Wie kann ich eine procedure die geinlined werden kann schreiben, die beide Varianten unterstützt, damit nicht so viel doppelter Code nötig ist?
Meine Assembler Kenntnisse sind dazu zu schlecht.

Grüße
TurboMagic

himitsu 28. Jul 2020 17:46

AW: Wie diese fast identischen ASM methoden vereinheitlichen?
 
Da es sich am Anfang nur um
Delphi-Quellcode:
lea edi, [eax].THash_SHA.FDigest
handelt, könnte man das Offest auch per Parameter reingeben.
Oder, ich würde mich einfach mal unbeliebt machen, und das Alte endlich rauswerfen. :duck:


Bezüglich Multiplatform wäre es schön, wenn es garkeinen Assembler gäbe, bzw. zusätzlich auch das nochmal in PurePascal.

Und in Hinblick auf 64 Bit gibt es noch dass Problem, dass es keinen Inline-Assembler mehr gibt.
Nur noch ganz oder garnicht = komplette Funktionen.
Also der Aufruf von SHABuffer müsste mit ins Assembler rein, oder das Assembler in eine eigene Funktion refaktoriert werden.

TurboMagic 28. Jul 2020 20:10

AW: Wie diese fast identischen ASM methoden vereinheitlichen?
 
Naja, mein Post enthält nur das Codefragment, mit dem ich gerade das Problem habe.
Es gibt in der DEC auch für alles PurePascal Implementierungen, nur wer Win32
nutzt, will evtl. die ASM Umsetzung, weil die einfach viel schneller ist.

Wie müsste diese Offset als Parameter Übergabe denn ausehen?

himitsu 28. Jul 2020 21:15

AW: Wie diese fast identischen ASM methoden vereinheitlichen?
 
Direkt aus dem Typ fällt mir jetzt nur die RTTI ein,
oder wie man es über eine Zeiger macht (siehe unten),
und ich glaub im Assembler ging es so
Delphi-Quellcode:
MOV EAX, OFFSET THash_SHA.FDigest
.

Delphi-Quellcode:
var X: THash_SHA;
i := NativeInt(@X.FDigest) - NativeInt(@X);
Wo ich grad nochmal drüber nachdachte, hab ich mal versucht die Rechnung zu kürzen
und (ungetestet) könnte es vielleicht so
Delphi-Quellcode:
NativeInt(@THash_SHA(nil).FDigest)
gehn. :gruebel:


Alternativ mach einen Boolean als Parameter und an der Stelle quasi ein IF-THEN-ELSE,
bzw. einen Integer mit IF-THEN, bzw. sowas wie ein CASE,
und dann dort die beiden Codes rein. :angle:


Delphi-Quellcode:
// ob es mit einer "Variable" direkt so geht
lea edi, [eax + DasOffset]
// glaub ich nicht, falls es nicht direkt ein Register ist, sondern eine Referenz, weil es ja vermutlich

// sowas geht ja nicht, auch nicht implizit
lea edi, [eax + [DasOffset]]

// also falls nicht Register, dann irgendwie so (oder mit anderem Register und ADD)
inc eax, DasOffset
lea edi, [eax]


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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